本质上是计数器
作用
保护共享资源
- 互斥
一个时刻只能一个进程来访问资源,强调唯一性 - 同步
强调顺序,有多个进程访问资源,按照顺序来访问
信号量的用法
- 定义一个唯一key(ftok)
- 构造一个信号量(semget)
- 初始化信号量(semctl SETVA)
- 对信号量进行P/V操作(semop)
- 删除信号集(semctl RMID)
semget函数
功能:获取信号量的ID
函数原型:
int semget(key_t key, int nsems, int semflg)
参数:
- key:信号量键值
- nsems:信号量数量
- semflg:
- IPC_CREATE:信号量不存在则创建
- mode:信号量的权限
返回值:
成功:信号量ID
失败:-1
semctl函数
功能:获取或设置信号量的相关属性
函数原型:
int semctl(int semid, int semnum, int cmd, union semun arg)
参数:
- semid:信号量ID
- semnum:信号量编号
- cmd:
- IPC_STAT:获取信号量的属性信息
- IPC_SET:设置信号量的属性
- IPC_RMID:删除信号量
- IPC_SETVAL:设置信号量的值
- arg:
union semun
{
int val;
struct semid_ds *buf;
}
返回值:
成功:由cmd类型决定
失败:-1
semop函数
函数原型:
int semop(int semid, struct sembuf *sops, size_t nsops)
参数:
-
semid:信号量ID
-
sops:信号量操作结构体数组
struct sembuf
{
short sem_num; // 信号量编号
short sem_op; // 信号量P/V操作
short sem_flg; // 信号量行为,SEM_UNDO
} -
nsops:信号量数量
返回值:
成功:0
失败:-1