在上一篇笔记中,学习了Posix信号量。这篇笔记主要学习System V信号量,该信号量增加了信号量集的方式。
创建
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
key
:信号量的标识符,可以使用ftok
函数获取nsems
:信号量的个数semflg
:操作符号,比如O_CREAT
方式Return Value
:成功返回信号量标识符,失败返回-1
一般操作操作
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semop(int semid, struct sembuf *sops, size_t nsops);
int semtimedop(int semid, struct sembuf *sops, size_t nsops,
const struct timespec *timeout);
semid
:semget
返回的标识符sops
:需要操作的信号量集的首地址nsops
:信号量集中元素的个数timeout
:超时参数
sembuf
含有一下几个参数:
unsigned short sem_num
:需要操作的信号量的编号,从0开始,最大是nsems - 1
。操作是原子的。short sem_op
:需要对信号量的操作。如果是个正数,则对应的信号量每次增加正数个单位。如果sem_flg
指定为SEM_UNDO
,那么减去相应的单位。如果是0,表示等待到0,即如果信号量是0,则立刻执行操作。short sem_flg
:信号量的标志,有IPC_NOWAIT
和SEM_UNDO
两个标志Return Value
:成功返回0,失败返回-1
更改操作
该操作比较复杂,具体直接参考手册。
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semctl(int semid, int semnum, int cmd, ...);