欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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个参数为欲设置的信号量值的数组首地址
相关标签: 信号量 IPC