什么是信号量?
理解
- 比喻一个场景:
- 一个房间有一把钥匙,有一个人拿了这把钥匙进了这个房间,第二个人想进这个房间而没有钥匙只能等待,等到房间里的人出来(把钥匙拿出来),第二个人拿到钥匙才能进入这个房间
- 这其中钥匙就是信号量
- 房间就是临界资源
- 信号量可以对临界资源进行管控(可以具体到进程间共享内存通信:A进程在往内存写,B不知道A在写,如果A在写B也写就会造成错乱)
特点
- (p操作:拿锁,,,v操作:放回锁)
- 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
- 信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作
- 每次对信号量的PV操作不仅限于对信号量值加1或减1,而且可以加减任意正整数
- 支持信号量组(Linux操作系统中不止一个信号量)
所使用函数原型
![](https://img-blog.csdnimg.cn/img_convert/2733891ced8b3eda523bdec9f01413cf.png)
#include<stdio.h>
#include<sys/sem.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include <unistd.h>
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
void pAction(int id)
{
struct sembuf set;
set.sem_num = 0;
set.sem_op =-1;
set.sem_flg =SEM_UNDO;
semop(id,&set,1);
}
void vAction(int id)
{
struct sembuf set;
set.sem_num = 0;
set.sem_op = 1;
set.sem_flg =SEM_UNDO;
semop(id,&set,1);
}
int main(int argv ,char **argc)
{
key_t key;
int semid;
key = ftok(".",2);
semid = semget(key,1,IPC_CREAT|0666);
union semun initem;
initem.val = 0;
semctl(semid,0,SETVAL,initem);
int pid =fork();
if(pid>0){
pAction(semid);
printf("Taked ok\n");
vAction(semid);
semctl(semid,0,IPC_RMID);
}
else if(pid==0){
printf("Put ok\n");
vAction(semid);
}
else{
printf("fork error\n");
}
return 0;
}