linux ipc之信号量

这里用01信号量演示两个进程轮流相互唤醒对方做一次输出的操作,当然也可以用文件锁来实现,但是文件锁效率实在没有信号量好,但是信号量容易出错,而且操作复杂!关于信号量的函数都在man文档里了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
union semun{
int val;
struct semid_ds *buf;
unsigned short *array;
};
int main(){
int sem_id = semget(IPC_PRIVATE,2,0666);
union semun sem_args;
unsigned short arr[2] = {1,0};
sem_args.array = arr;
semctl(sem_id,1,SETALL,sem_args);
struct sembuf sem_done1[1] = {0,-1,SEM_UNDO};
struct sembuf sem_up1[1] = {0,1,SEM_UNDO};
struct sembuf sem_done2[1] = {1,-1,SEM_UNDO};
struct sembuf sem_up2[1] = {1,1,SEM_UNDO};
if(fork() == 0){
while(1){
semop(sem_id,sem_done1,1);
printf("childn");
semop(sem_id,sem_up2,1);
}
}else{
while(1){
semop(sem_id,sem_done2,1);
printf("parentn");
semop(sem_id,sem_up1,1);
}
}
return 0;
}