1 #include <unistd.h>
2 #include<stdio.h>
3 #include <sys/sem.h>
4
5 // int semget(key_t key, int nsems, int semflg);
6 // int semop(int semid, struct sembuf *sops, size_t nsops);
7 // int semctl(int semid, int semnum, int cmd, ...);
8 union semun {
9 int val; /* Value for SETVAL */
10 struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
11 unsigned short *array; /* Array for GETALL, SETALL */
12 struct seminfo *__buf; /* Buffer for IPC_INFO
13 (Linux-specific) */
14 };
15
16 void pGetKey(int semid)
17 {
18 struct sembuf sops;
19 sops.sem_num = 0;
20 sops.sem_op = -1;
21 sops.sem_flg = SEM_UNDO;
22
23 semop(semid,&sops,1);
24 printf("get key\n");
25 }
26 void vPutKey(int semid)
27 {
28 struct sembuf sops;
29 sops.sem_num = 0;
30 sops.sem_op = 1;
31 sops.sem_flg = SEM_UNDO;
32
33 semop(semid,&sops,1);
34 printf("put back key\n");
35 }
36
37 int main()
38 {
39 int semid;
40 key_t key;
41 key = ftok(".",3);
42 semid = semget(key,1,IPC_CREAT|0600);
43
44 union semun temp;
45 temp.val = 0;
46 semctl(semid,0,SETVAL,&temp);
47
48 pid_t pid;
49 pid=fork();
50
51 if(pid>0){
52 pGetKey(semid);
53 printf("this is father\n");
54 vPutKey(semid);
55 semctl(semid,0,IPC_RMID);
56 }else if(pid==0){
57 printf("this is child\n");
58 vPutKey(semid);
59 }
60
61 return 0;
62 }
~
~
~
信号量使用介绍
最新推荐文章于 2024-05-16 17:29:10 发布