【Linux】进程间通信--共享内存实现及演示

这篇博客展示了如何使用C语言的系统调用 shmget, shmat, shmdt 和 shmctl 进行共享内存的创建、连接、读取和删除。通过两个独立的进程,一个用于写入数据(如递增数字),另一个用于读取并显示这些数据,揭示了共享内存的并发特性,即在没有互斥和同步机制的情况下,数据可能反映出之前的执行状态。
摘要由CSDN通过智能技术生成

读数据:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 #include<sys/shm.h>
  5 #define IPC_KEY 0X12345678
  6 int main(){
  7   //创建共享内存
  8   int shmid=shmget(IPC_KEY,4096,IPC_CREAT|0664);
  9   if(shmid<0){
 10     perror("shget error");
 11     return -1;
 12   }
 13   //进程连接共享内存
 14   void* shm_start=shmat(shmid,NULL,0);
 15   if(shm_start==(void*)-1){
 16     perror("shmat error");
 17     return -1;
 18   }
 19   //演示内存操作
 20   while(1){                                                                                                                                                                            
 21     printf("%s\n",(char*)shm_start);
 22     sleep(2);
 23   }
 24   //关闭进程连接
 25   shmdt(shm_start);
 26   //删除共享内存
 27   shmctl(shmid,IPC_RMID,NULL);
 28 
 29   return 0;
 30 }

写数据:

    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 #include<sys/shm.h>
    5 #define IPC_KEY 0X12345678
    6 int main(){
    7   //创建共享内存
    8   int shmid=shmget(IPC_KEY,4096,IPC_CREAT|0664);
    9   if(shmid<0){
   10     perror("shget error");
   11     return -1;
   12   }
   13   //进程连接共享内存
   14   void* shm_start=shmat(shmid,NULL,0);
   15   if(shm_start==(void*)-1){
   16     perror("shmat error");
   17     return -1;
   18   }
   19   int idx=1;
   20   //演示内存操作
   21   while(1){
   22     sprintf(shm_start,"数字:%d\n",++idx);
   23     //向字符串内格式化输入,注意每次都是写到开头元素                                                                                               
   24     sleep(2);
   25   }
   26   //关闭进程连接
   27   shmdt(shm_start);
   28   //删除共享内存
   29   shmctl(shmid,IPC_RMID,NULL);
   30 
   31   return 0;
   32 }

演示:
在这里插入图片描述在这里插入图片描述

查看进程通信:
在这里插入图片描述

注意:
1.共享内存不存在互斥和同步.
2.共享内存生命周期随内核,即:我们ctrl+c退出上面的程序,由于死循环while(1),下次read运行程序内容为上次遗留的内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值