Linux 之信号量通信机制

信号量通信机制主要用于实现进程间的同步,避免并发访问共享资源。其过程与数据结构与消息队列很相似。
1、使用函数semget()创建信号量集合:

// from /usr/include/sys/sem.h
int semget(key_t key,int sems,int flag);

函数第一个参数为ftok()产生的键值,第二个为创建的信号量个数,第三个表示信号量集合的权限及属性。同消息队列:

//from /usr/include/bit/ipc.h
#define  IPC_CREAT  00001000  //如果key值不存在则创建
#define  IPC_EXCL   00002000  //如果key存在,则返回失败
#define  IPC_NOWAIT 00004000  //如果需要等待时,直接返回错误

2、使用函数semctl信号量集合或信号量:

//from /usr/include/sys/sem.h
int semctl(int semid,int semnum,int cmd,...);

函数第1个参数为semget返回的信号量集合id,第2个参数为操作信号量时,要操作的信号量的编号 。第3个参数为要执行的操作,如果是要操作整个信号量集合的话,其值包括:

//from /usr/include/linux/ipc.h
#define  IPC_RMID  0    // 立即删除消息队列
#define  IPC_SET   1    // 设置buf中的消息队列属性
#define  IPC_STAT  2    // 获取消息队列的属性并保存在buf中
#define  IPC_INFO  3    // 获取限制信息

如果只是操作单个信号量,其选项包括:

#define GETPID  11  //获取信号拥有者的pid
此时,第2个参数应为0,第4个参数无效,如果执行成功,将返回该进程的pid,否则返回-1#define  GETVAL 12  //返回获取某个信号量的值
此时,第2个参数为某信号量的编号

#define  SETVAL 16  //设置某信号量的值
此时,第2个参数为某信号量的编号,第4个参数为要设置的值

#define SETALL  17  //设置所有信号量的值
此时,第2个参数为0,第4个参数为欲设置的信号量值的数组首地址

你可能感兴趣的:(Linux)