信号量的代码
#############################
makefile
1 test:test.c comm.c
2 gcc -o $@ $^
3
4 .PHONY:clean
5 clean:
6 rm -f test
7
头文件
1 #ifndef __COMM_H__
2 #define __COMM_H__
3
4 #include<sys/types.h>
5 #include<sys/ipc.h>
6 #include<sys/sem.h>
7 #include<stdio.h>
8
9 union semun {
10 int val; /* Value for SETVAL */
11 struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
12 unsigned short *array; /* Array for GETALL, SETALL */
13 struct seminfo *__buf; /* Buffer for IPC_INFO */
14 };
15 #define PROJ_ID 0X6666
16 #define PATHNAME "."
17 int creatSemSet(int nums);
18 int getSemSet(int nums);
19 int P(int semid,int num);
20 int initSemSet(int semid,int which,int val);
21 int V(int semid,int num);
22 int destroySemSet(int semid);
23 int initSemSet(int semid,int which,int val);
24
25
26 #endif //__COMM_H__
函数文件
1 #include"comm.h"
2
3 static int commSemSet(int nums,int flag)
4 {
5 key_t _k=ftok(PATHNAME,PROJ_ID);
6 if(_k<0)
7 {
8 perror("ftok");
9 return -1;
10 }
11 int semid=semget(_k,nums,flag);
12 if(semid<0)
13 {
14 perror("semget");
15 return -2;
16 }
17 return semid;
18 }
19
20 int initSemSet(int semid,int which,int val)
21 {
22 union semun _un;
23 _un.val=val;
24 if(semctl(semid,which,SETVAL,_un)!=0)
25 {
26 perror("semctl");
27 return -1;
28 }
29 return 0;
30 }
31
32 int creatSemSet(int nums)
33 {
34 return commSemSet(nums,IPC_CREAT|IPC_EXCL|0666);
35 }
36 int getSemSet(int nums)
37 {
38 return commSemSet(nums,IPC_CREAT);
39
40 }
41 static int commPV(int semid,int num,int op)
42 {
43 struct sembuf _sf;
44 _sf.sem_num=num;
45 _sf.sem_op=op;
46 _sf.sem_flg=0;
47 if(semop(semid,&_sf,1)!=0)
48 {
49 perror("semop");
50 return -1;
51 }
52 return 0;
53 }
54 int V(int semid,int num)
55 {
56 return commPV(semid, num,1);
57 }
58 int P(int semid,int num)
59 {
60 return commPV(semid, num,-1);
61 }
62 int destroySemSet(int semid)
63 {
64 if(semctl(semid,0,IPC_RMID)<0)
65 {
66 perror("semctl");
67 return -1;
68 }
69 return 0;
70 }
测试文件
1 #include"comm.h"
2
3 int main ()
4 {
5
6 int semid= creatSemSet(1);
7 initSemSet(semid,0,1);
8
9 if(fork()==0)
10 {
11 //child
12 int _semid= getSemSet(0);
13 while(1)
14 {
15 P(_semid,0);
16 printf("A");
17 fflush(stdout);
18 usleep(152677);
19 printf("A ");
20 fflush(stdout);
21 usleep(112677);
22 V(_semid,0);
23 }
24 }
25 else
26 {
27 //father
28 while(1)
29 {
30 P(semid,0) ;
31 printf("B");
32 fflush(stdout);
33 usleep(152377);
34 printf("B ");
35 fflush(stdout);
36 usleep(114677);
37 V(semid,0);
38 }
39 }
40
41 destroySemSet(semid);
42 return 0;
43 }