LinuxIPC信号量
信号量
1 |
|
- 函数semget创建一个信号集或访问一个已存在的信号集。返回值:成功时返回信号量标识符的整数,出错时返回-1
- 参数key时唯一标识一个信号量的关键字,如果为IPC_PRIVATE(值为0,私有)表示创建一个可以被多个进程共享的信号量
- 参数nsems指定需要使用的信号量的数目。如果是创建新集合,必须指定nsems,如果引用一个现存的集合,则指定为0
- 参数flag是一组标志,其作用与open函数的标志很相似,它低端九位是该操作量的权限
- 函数semop用于改变信号量对象中各个信号量的状态。返回值:成功时返回0;失败时返回-1
参数cmd为执行的操作,通常为 | 参数 | 说明 | | -------- | ------------------------------------------------------------ | | IPC_RMID | 立即删除信号集,唤醒所有被阻塞进程 | | GETVAL | 根据semun返回信号量的值,从0开始,第一个信号编号为0 | | SETVAL | 根据semun设定信号的值,从0开始,将所有的信号存入semun.array中 | | SETALL | 将所有semun.array的值设定到信号集中,第二个参数为0 | 参数...是一个union semun(需要自己定义),至少包含以下成员
1
2
3
4
5struct sembuf{
short sem_num;//编号,从0开始
short sem_op;//信号量,-1:p操作,+1:v操作
short sem_flg; //通常设为:SEM_UNDO,程序结束,信号量为semop调用前的值
};删除命令是ipcrm [-m|-s|-q] id1
2
3
4
5
6union semun{
int val;
struct semid_da *buf;
unsigned short *array;
};
//通常情况只用val,给val赋值1
-m 删除共享内存,-s删除共享信号量,-q删除共享队列。
ipcrm -m shmid
ipcrm -s semid
ipcrm -q msqid