Linux 之信号量通信机制
程序员文章站
2022-06-04 21:58:01
...
信号量通信机制主要用于实现进程间的同步,避免并发访问共享资源。其过程与数据结构与消息队列很相似。
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个参数为欲设置的信号量值的数组首地址
上一篇: Spring AOP面向切面编程
下一篇: 三维数组