多线程多进程3

共享内存

        是系统5提供的一个IPC通信方式,是系统5提供的三种通信方式中,效率最高的

        在系统中申请一片内存区,这块内存区主要是用于信息直接传递

        这块内存区就叫共享内存        共享内存不会自主阻塞

        

        共享内存实现步骤

                1>创建或获取共享内存

                2>将共享内存映射到进程中

                3>接触映射

                4>删除共享内存

        1>创建或获取共享内存

                shmget        头文件:#include <sys/ipc.h>        <sys/shm.h>

                int  shmget(key_t key,size_t size,int shmflg);功能:创建或获取共享内存

                参数:key:密钥        ---->IPC对象的重要区分依据

                        获取key:1>自动获取:IPC_PRIVAT  0

                                                                系统自动分配        >不断生成共享内存

                                        2>手动获取

                                                ftok        头文件:<sys/types.h>        <sys/ipc.h>

                                                key_t ftok(const char *pathname,int proj_id);功能:创建key

                                                参数:pathname:工程文件名        proj_id:工程ID

                                        PS:只要参数不变,永远可以找到同一个key

                                                key1=ftok("pause.c",1);

                                                key2=ftok("pause.c",1);

                                                key1=key2

                                                返回值:成功返回key        失败返回-1,并设置错误码

                                        size:共享内存的大小

                                        shmflg:IPC_CREAT|0666

                        返回值:成功返回共享内存ID        失败返回-1,并设置错误码

        

        2>将共享内存映射到进程中

                shmat        头文件:#include <sys/types.h>        <sys/shm.h>

                void  *shmat(int shamid,const void *shmaddr,int shmflg);

                功能:将共享内存映射到进程中

                参数:shmid:shmget的返回值

                           shmaddr:你想映射到的地方        :NULL    ---> 默认函数寻找

                           shmflg:0        可读可写

                返回值:成功返回void * 地址        失败返回(void *)-1,并设置错误码

        3>解除映射

                shmdt        头文件:#include <sys/types.h>        <sys/shm.h>

                int shmdt(const void *shmaddr);        功能:解除映射

                参数:shmaddr:映射地址

                参数:成功返回0        失败返回-1,并设置错误码

        4>删除共享内存

                shmctl        头文件:#include <sys/ipc.h> <sys/shm.h>

                int  shmctl(int shmid,int cmd,struct shmid_ds *buf);

                功能:对共享内存的操作

                参数:shmid:共享内存的ID号

                           cmd:选项

                                        IPC_RMID:删除共享内存

                           buf:给选项赋予的值

                                        IPC_RMID:NULL

                返回值:IPC_RMID

                                成功返回0,        失败返回-1,并设置错误码

系统5:信号量

        是IPC通信方式的一种,由一个或多个信号灯组成一个信号组/信号量

        其中信号量中每一个信号灯都是单独计数的

        PS:信号量和我们学习的共享内存不同

                共享内存主要侧重于:双进程通信

                信号量主要侧重于:进程控制另外一个进程阻塞或释放

        1>操作流程:

                1>创建或获取信号量

                2>对信号灯进行操作:PV操作

                3>删除信号量

        1>创建或获取信号量

        semget        头文件:#include <sys/types.h> <sys/ipc.h> <sys/sem.h>

        int semget(key_t key,int nsems,int semflg);功能:创建或获取信号量

        参数:key:参考共享内存

                   names:信号量中信号灯的个数

                   semflg:IPC_CREAT|0666

        返回值:成功返回信号量ID        失败返回-1,并设置错误码

        2>对信号灯的操作

        semop        头文件:#include <sys/types.h> <sys/ipc.h> <sys/sem.h>

        int semop(int semid,struct sembuf *sops,size_t nsops);功能:对信号灯做操作

        参数:semid:semget的返回值

                   sops:结构体指针  -->集合赋值        多灯-->数组赋值

                   struct sembuf * {

                        unsigned short sem_num;         //信号灯下标

                        short  sem_op;        //加减法操作:PV操作:+1 -1 +2 -2

                        short  sem_flg;        //模式: 0阻塞   IPC_NOWAIT:不阻塞

                    }

                    nsops:第几个操作    不是下标

        返回值:成功返回0        失败返回-1,并设置错误码

        3>删除信号量

        semctl        头文件:#include <sys/types.h> <sys/ipc.h> <sys/sem.h>

        int semctl(int semid,int semnum,int cmd, ...);功能:对信号量的操作

        参数:semid:信号量的ID号

                   semnum:信号灯的下标

                   cmd:功能选择:

                        IPC_RMID:删除信号量

                        GETVAL:获取信号灯的value值

                        SETVAL:设置信号灯的value值

                ... 功能选择值

                        IPC_RMID:NULL

                        GETVAL:NULL

                        SETVAL:union semun{

                        int          val;    /* Value for SETVAL */    设置值
                         struct semid_ds *buf;    /* Buffer for IPC_STAT, IPC_SET */
                               unsigned short  *array;  /* Array for GETALL, SETALL */
                               struct seminfo  *__buf;  /* Buffer for IPC_INFO

                        }

        返回值:GETVAL:成功返回value值        其他成功返回0

                        失败返回-1,并设置错误码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值