信号量主要用来实现进程间的同步问题,避免并发访问共享资源
在实际应用中,两个进程间通信可能会使用多个信号量,因此Linux在管理是以信号量集来管理
信号量集合使用指针指向一个由数组组成的信号量单元,在此信号量单元中存储了个信号量的值
1、创建信号量集合(semget)
2、控制信号量集合、信号量(semctl)
该函数最多可有4个函数。当第三个参数为SETVAL/SETALL,即对信号量的设置,就要有第四个参数
- 如果操作是SETVAL,则第四个值为val,是相应信号量的值。
- 如果操作为SETALL&GETALL,则第四个参数为数组地址。
删除信号量
将semctl
函数的第二个参数设为IPC_RMID;
或者用命令删除ipcrm -S key
;
3、信号量操作(semop)
用semop函数完成PV操作
struct sembuf
{
unsigned short sem_num; /* semaphore number */ 信号量下标
short sem_op; /* semaphore operation */ -1 / +1
short sem_flg; /* operation flags */ 0
}
struct sembuf sops[2];
/*P操作*/
sops[0].sem_num=1;
sops[0].sem_op=-1;
sops[0].sem_flg=0;
/*V操作*/
sops[1].sem_num=2;
sops[1].sem_op=1;
sops[1].sem_flg=0;
上面的代码表示对信号量1进行P操作(-1),对第二个信号量进行V操作(+1)