标签:进程通信
comm.h
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<sys/types.h>
4 #include<sys/ipc.h>
5 #include<sys/sem.h>
6 #define _PATH_ "."
7 #define _PROJ_ID_ 0x6666
8
9 union semun
10 {
11 int val;
12 struct semid_ds *buf;
13 unsigned short *array;
14 struct seminfo *__buf;
15 };
16 int creat_sem(int sem_nums);
17 int get_sem(int sem_nums);
18 int init_sem(int sem_id,int sem_num,int init_val);
19 int p_sem(int sem_id,int sem_num);
20 int v_sem(int sem_id,int sem_num);
21 int distroy_sem(int sem_id);
comm.c
1 #include"comm.h"
2
3 int comm_creat_sem(int flags,int sem_nums)
4 {
5 key_t _key = ftok(_PATH_,_PROJ_ID_);
6 if(_key == -1)
7 {
8 perror("ftok");
9 return -1;
10 }
11 int sem_id = semget(_key,sem_nums,flags);
12 if(sem_id==-1)
13 {
14 perror("semget");
15 return -1;
16 }
17 return sem_id;
18 }
19 int creat_sem(int sem_nums)
20 {
21 int flags = IPC_CREAT|IPC_EXCL|0666;
22 return comm_creat_sem(flags,sem_nums);
23 }
24 int get_sem(int sem_nums)
25 {
26 int flags = IPC_CREAT;
27 return comm_creat_sem(flags,sem_nums);
28
29 }
30 int init_sem(int sem_id,int sem_num,int init_val)
31 {
32 union semun un;
33 un.val = init_val;
34 if(semctl(sem_id,sem_num,SETVAL,un,NULL)==-1)
35 {
36 perror("semctl");
37 return -1;
38 }
39 return 0;
40 }
41 int op_sem(int sem_id,int sem_num,int op)
42 {
43 struct sembuf sem[1];
44 sem[0].sem_num = sem_num;
45 sem[0].sem_op = op;
46 sem[0].sem_flg = 0;
47 if(semop(sem_id,&sem[0],1)==-1)
48 {
49 perror("semop");
50 return -1;
51 }
52 return 0;
53 }
54 int p_sem(int sem_id,int sem_num)
55 {
56 return op_sem(sem_id,sem_num,-1);
57 }
58 int v_sem(int sem_id,int sem_num)
59 {
60 return op_sem(sem_id,sem_num,1);
61 }
62 int distroy_sem(int sem_id)
63 {
64 if(semctl(sem_id,0,IPC_RMID,NULL)==-1)
65 {
66 perror("semctl");
67 return -1;
68 }
69 return 0;
70 }
test.c
1 #include"comm.h"
2 #include<unistd.h>
3 #include<stdlib.h>
4 int main()
5 {
6 int sem_id = creat_sem(1);
7 if(sem_id==-1)
8 {
9 return -1;
10 }
11 init_sem(sem_id,0,1);
12 pid_t id = fork();
13 if(id<0)
14 {
15 perror("fork");
16 exit(1);
17 }
18 else if(id == 0)
19 {
20 int sem_id = get_sem(0);
21 while(1)
22 {
23 p_sem(sem_id,0);
24
25 printf("A");
26 fflush(stdout);
27 sleep(1);
28 printf("A");
29 fflush(stdout);
30 sleep(1);
31
32 v_sem(sem_id,0);
33 }
34 }
35 else
36 {
37 while(1)
38 {
39 p_sem(sem_id,0);
40
41 printf("B");
42 fflush(stdout);
43 sleep(1);
44 printf("B");
45 fflush(stdout);
46 sleep(1);
47
48 v_sem(sem_id,0);
49 }
50 waitpid(id,NULL,0);
51 distroy_sem(sem_id);
52
53 }
54 return 0;
55 }
结果:
[fbl@localhost sem]$ ./test
BABAABABAABBAABABAABABAABBAABABAABABAA^C
[fbl@localhost sem]$ ./test
BBAABBAABBAABBAABBA^C标签:进程通信
原文地址:http://fengbaoli.blog.51cto.com/10538178/1763822