题目要求:
两个进程之间有序完成一个写一个读,顺序打印0~100
解题思路:
要完成一个进程写另一个进程读,就必须要保证两个进程可以访问同一块地址空间,这里我们就可以使用共享内存,要有序就要同步使用信号量来控制。我们设定信号量为1,进程1先P申请信号量完成写的工作后V释放信号量,这时进程2再P申请信号量完成读的工作后再V释放信号量,依次类推就可以完成有序的读写
所用主要函数:
创建或打开共享内存:shmget(key_t key,size_t size);
创建或打开信号量:int semget(key_t key,int nsems,int flags);
设置信号量初值:semctl(int semid,int semnum,int cmd,su);
PV操作:semop (int id,struct sembuf sb[],int len);
让共享内存和本进程建立关系:shmat(int id ,const char*shmaddr,int flag);
具体代码:
put.c
1 #include<stdlib.h>
2 #include<stdio.h>
3 #include<string.h>
4 #include<unistd.h>
5 #include<sys/ipc.h>
6 #include<sys/shm.h>
7 #include<sys/sem.h>
8 void V(int semid)
9 {
10 struct sembuf sb[1];
11 sb[0].sem_num=0;
12 sb[0].sem_op=1;
13 sb[0].sem_flg=0;
14 }
15 union semun
16 {
17 int val;
18 };
19 void P(int semid)
20 {
21 struct sembuf sb[1];
22 sb[0].sem_num=0;
23 sb[0].sem_op=-1;
24 sb[0].sem_flg=0;
25 }
26 int main()
27 {
28 int shmid=shmget(1,sizeof(int),IPC_CREAT|0644);
29 if(shmid==-1)
30 {
31 perror("shmget");
32 exit(1);
33 }
34 int semid=semget(2,1,IPC_CREAT|0644);
35 if(semid==-1)
36 {
37 perror("semget");
38 exit(1);
39 }
40 union semun su={1};
41 semctl(semid,0,SETVAL,su);
42 int *p=shmat(shmid,NULL,0);
43 int num=0;
44 while(1)
45 {
46 P(semid);
47 sleep(2);
48 *p=num++;
49 V(semid);
50 }
51 }
get.c
1 #include<stdlib.h>
2 #include<stdio.h>
3 #include<string.h>
4 #include<unistd.h>
5 #include<sys/ipc.h>
6 #include<sys/shm.h>
7 #include<sys/sem.h>
8 void V(int semid)
9 {
10 struct sembuf sb[1];
11 sb[0].sem_num=0;
12 sb[0].sem_op=-1;
13 sb[0].sem_flg=0;
14 }
15 void P(int semid)
16 {
17 struct sembuf sb[1];
18 sb[0].sem_num=0;
19 sb[0].sem_op=-1;
20 sb[0].sem_flg=0;
21 }
22 int main()
23 {
24 int shmid=shmget(1,0,0);
25 if(shmid==-1)
26 {
27 perror("shmget");
28 exit(1);
29 }
30 int semid=semget(2,0,0);
31 if(semid==-1)
32 {
33 perror("semget");
34 exit(1);
35 }
36 int *p=shmat(shmid,NULL,0);
37 while(1)
38 {
39 P(semid);
40 printf("p=%d\n",*p);
41 V(semid);
42 }
43 }