SysV 信号量集 : 一个信号量数组; 命令 ipcs - s 查看
//这个联合体 有些linux系统中没定义. 其实可用可不用
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
semget : 创建或获取一个信号量集 . 第2个参数, 指定N个信号量;
semop: 修改一个或一批信号量. 相当于 posix 中的 sem_wait 和 sem_post 综合体
每个信号量由struct sembuf 控制.
sem_num 表示第N个信号量.
sem_op 可以是 > 0 , 0 , <0 , 相当于 sem_post == 1, sem_wait == -1;
sem_flg : IPC_NOWAIT 不阻塞, SEM_UNDO 还原;
sem_ctl : 给信号量赋值, 删除, 状态等
SEM_UNDO: 如果指定了. 不论当前进程是否正常退出 都将还原此操作的 sem_op 值. 用于以防万一异常结束的进程
如果是生产者/消费者的情况,则不应该使用
比如: