Linux进程间通信--信号量
文章摘要:
操作系统: Debian8
创建信号量:
$ ipcmk -S 1 -p 644
Semaphore id: 196609
查看信号量:
$ ipcs -s
------ Semaphore Arrays --------
key semid owner perms nsems
0x0c01d24b 196609 user 644 1
nsems表示信号量数量(非信号数量)
删除信号量:
$ ipcrm -s 196609
函数说明:
#include <sys/sem.h>
#include <sys/ipc.h>
/*
* 函数原型: int semget(key_t key, int nsems, int oflag)
* 参数说明: key - 键值
* nsems - 信号量个数
* oflag - 访问权限
* 返 回 值: semid
*/
semid = semget(0x1234, 1, IPC_CREAT | 0666);
PV操作
/*
* 函数原型:int semop(int semid,
* struct sembuf *opsptr,
* sizt_t nops);
* 返 回 值:0 - 成功, -1 - Error
*/
struct sembuf semb;
semb.sem_num = 0; // 信号量编号
semb.sem_op = 1; // 正值为V操作/负值为P操作
semb.sem_flg = SEM_UNDO; // {SEM_UNDO,SEM_NOWAIT}
semop(semid, &semb, 1); // sembuf个数
sem_flg说明:
SEM_UNDO 表示在进程退出时,如果该进程占用其他资源,则操作系统释放该资源
SEM_NOWAIT 表示不阻塞
控制类操作:
/*
* 函数原型:int semctl(int semid, // 信号量标识
* int semnum, // 信号量编号
* int cmd, // 命令字
* ...); // 可选参数
* 返 回 值:与操作相关
*/
设置指定信号量的信号值:
ret = semctl(semid, 0, SETVAL, 1);
获取指定信号量的信号值:
// 返回值表示该信号量的信号值
ret = semctl(semid, 0, GETVAL);
设置所有信号量的信号值:
unsigned short val[10];
memset(val, 1, 10);
ret = semctl(semid, 0, GETALL, val);
获取所有信号量的信号值:
unsigned short val[10];
ret = semctl(semid, 0, GETALL, val);
- 信号量编号为0
- val数组长度需与nsem相同
- 返回值:0 - 成功, 负值 - 失败
删除所有信号:
ret = semctl(semid, 0, IPC_RMID);