【编程】利用共享内存和信号完成进程间通信

题目要求:

两个进程之间有序完成一个写一个读,顺序打印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 }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值