三个进程实现ABCABCABC…的有序打印:
设置三个信号量:
sem.h
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<sys/sem.h>
4
5 #define SEM_NUM 3
6 #define SEM1 0
7 #define SEM2 1
8 #define SEM3 2
9
10 union semun
11 {
12 int val;
13 };
14
15 int sem_init();
16 void sem_p(int index);//0 1 2
17 void sem_v(int index);
18 void sem_destory();
sem.c
1 #include"sem.h"
2
3 static int semid = -1;
4 union semum
5 {
6 int val;
7 };
8
9 int sem_init()
10 {
11 semid = semget((key_t)1234,SEM_NUM,IPC_CREAT|IPC_EXCL|0600);
12 if(semid==-1)
13 {
14 semid = semget((key_t)1234,SEM_NUM,0600);
15 if(semid==-1)
16 {
17 printf("semget err\n");
18 return-1;
19 }
20 }
21 else
22 {
23 int arr[SEM_NUM]={1,0,0};
24 for(int i=0;i<SEM_NUM;i++)
25 {
26 union semum a;
27 a.val =arr[i];
28 if(semctl(semid,i,SETVAL,a)==-1)
29 {
30 printf("semctl err\n");
31 return -1;
32 }
33 }
34 }
35 }
36 void sem_p(int index)//0 1 2
37 {
38 if(index<0||index>=SEM_NUM)
39 {
40 return;
41 }
42 struct sembuf buf;
43 buf.sem_num=index;
44 buf.sem_op=-1;
45 buf.sem_flg=SEM_UNDO;//
46 if(semop(semid,&buf,1)==-1)
47 {
48 return;
49 }
50 }
51 void sem_v(int index)
52 {
53 if(index<0||index>=SEM_NUM)
54 {
55 return;
56 }
57 struct sembuf buf;
58 buf.sem_num=index;
59 buf.sem_op=1;
60 buf.sem_flg=SEM_UNDO;//
61 if(semop(semid,&buf,1)==-1)
62 {
63 return;
64 }
65 }
66 void sem_destory()
67 {
68 if(semctl(semid,0,IPC_RMID)==-1)
69 {
70 return;
71 }
72 }
A.c
1 #include<stdio.h>
2 #include"sem.h"
3
4 int main()
5 {
6 int res =sem_init();
7 if(res==-1)
8 {
9 return 0;
10 }
11 for(int i=0;i<5;i++)
12 {
13 sem_p(SEM1);
14 printf("A");
15 fflush(stdout);
16 sleep(1);
17 sem_v(SEM2);
18 }
19 }
B.c
1 #include<stdio.h>
2 #include"sem.h"
3
4 int main()
5 {
6 int res =sem_init();
7 if(res==-1)
8 {
9 return 0;
10 }
11 for(int i=0;i<5;i++)
12 {
13 sem_p(SEM2);
14 printf("B");
15 fflush(stdout);
16 sleep(1);
17 sem_v(SEM3);
18 }
19 }
C.c
1 #include<stdio.h>
2 #include"sem.h"
3
4 int main()
5 {
6 int res =sem_init();
7 if(res==-1)
8 {
9 return 0;
10 }
11 for(int i=0;i<5;i++)
12 {
13 sem_p(SEM3);
14 printf("C");
15 fflush(stdout);
16 sleep(1);
17 sem_v(SEM1);
18 }
19 }
运行结果:
stu@stu-virtual-machine:~/Test/信号量举例/三信号量$ ./A& ./B& ./C&
[1] 3653
[2] 3654
[3] 3655
stu@stu-virtual-machine:~/Test/信号量举例/三信号量$ ABCABCABCABCABC
[1] 已完成 ./A
[2]- 已完成 ./B
[3]+ 已完成 ./C
B& ./C&
[1] 3653
[2] 3654
[3] 3655
stu@stu-virtual-machine:~/Test/信号量举例/三信号量$ ABCABCABCABCABC
[1] 已完成 ./A
[2]- 已完成 ./B
[3]+ 已完成 ./C