进程间通信之信号量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程间通信之信号量相关的知识,希望对你有一定的参考价值。

本质:计数器。当前资源个数
生命周期:随内核
本身不具有数据交换的功能,是通过控制其他通信资源(文件、外部设备)来实现进程间通信,本身是一种外部资源的标识。在此过程中负责数据操作的互斥与同步功能。
互斥:独占临界资源(排他)
同步:建立在互斥基础上(顺序性)
主要作用:协调进程对共享资源的访问,保证在任一时刻,只有一个执行线程访问代码的临界区域。(其中共享内存的使用就要用到信号量)
操作:
p操作:申请资源(以信号量集为单位申请)
v操作:释放资源



int semctl(int semid, int semnum, int cmd, ...);   //系统调用它用来执行在信号量集上的控制操作
或者int semctl(int semid,int semnum,int cmd, /*union semun arg*/);
     semid:信号量集IPC标识符
     semnum:操作信号在信号量集中的编号(第一个信号的编号是0)
     cmd中的操作:
                              IPC_STAT:读取一个信号量集的数据结构semid_ds,将其存储在semun中的buf参数中
                              IPC_SET:设置信号量集的数据结构semid_ds的元素ipc_perm,其值取自semun中的buf参数
                              IPC_RMID:将信号量集从内存中删除
                              IPC_SETVAL:设置信号量集中的一个单独的信号量的值
     arg:代表一个semun的实例(它是一个联合类型的副本,而不是一个指向联合类型的指针)   
              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
               };
               struct semid_ds
               {
                    struct ipc_perm sem_perm;  //Ownership and permissions
                    time_t sem_otime;  //last semop time
                    time_t sem_ctime;  //last change time
                    unsigned short sem_nsems;  //No. of semaphores in set
               };
     成功:返回一个正数
     失败:-1
int semget(key_t key, int nsems, int semflg);      //获取与某个键关联的信号量集标识
     nsems:创建的信号量集中的信号量的个数,该参数只在创建信号量集时有效
     成功:返回信号量集IPC标识符
     失败:-1
int semop(int semid, struct sembuf * sops, unsigned nsops);   //P、V操作通过调用semop函数实现,大于0表示当前可用的资源数的数量,小于0表示等待使用该资源的进程个数
     semid:信号集的识别码,通过semget获取
     sops:指向存储信号操作结构的数组指针
                struct sembuf
                {
                    unsigned short sem_num;  //semaphore number,操作信号在信号集中的编号,第一个编号是0
                    short sem_op;  //semaphore operation
                    short sem_flg;  //operation flags
                };
                    sem_op:若其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;若其值为负数,而其绝对值又大于信号的现值,操作会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;若其值为0,则操作将暂时阻塞,直到信号的值变为0
                    sem_flg:信号操作标志
                                   IPC_NOWAIT  //对信号的操作不能满足时,semop()不会阻塞,并立即返回
                                   IPC_UNDO  //程序结束时(不论正常或异常),保证信号值会被重设为semop()调用前的值。避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定
     nsops:信号操作结构的数量,恒大于或等于1
     
     成功:0
     失败:-1


以上是关于进程间通信之信号量的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程通信之匿名管道

Linux 进程间通信系列之 信号

进程间通信——System V IPC 之进程信号量

多进程编程之进程间通信-管道和消息队列

进程间通信之信号

Linux系统编程之进程间通信