Linux进程间通信(ipc)——共享内存

共享内存:
步骤1:创建/打开共享内存。
步骤2:映射。
步骤3:读写数据。
步骤4:释放共享内存。
步骤5:删除共享内存。

查看系统中共享内存可以使用:ipcs -m。
删除系统中的共享内存可以使用:ipcm -m ****(共享内存的id号)

创建和写入数据的进程:

#include<stdio.h>
#include<stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
#include <unistd.h>

//      int shmget(key_t key, size_t size, int shmflg);
//      void *shmat(int shmid, const void *shmaddr, int shmflg);
//       int shmdt(const void *shmaddr);
//       int shmctl(int shmid, int cmd, struct shmid_ds *buf);
int main()
{
      key_t key;             
      key = ftok(".",0);                     //利用ftok生成键值

      char  *shmaddr;

      char shmsg[128] = "cao hai";                 

      int shmId = shmget(key,1024*4,IPC_CREAT|0666);             //创建/打开共享内存,第二个参数为共享内存的大小,通常以Mbit作为单位进行开辟,
                                                                 //第三个参数为创建标志,0666是为该共享内存设置为可读可写类型。
      if(shmId == -1){

           printf("shmget failure\n");
           exit(-1);
      }

      shmaddr = shmat(shmId,0,0);                                //将共享内存映射储存空间第二个参数通常使用0让系统自动为共享内存分配空间,
                                                                 //第三个参数使用0,代表映射的共享内存为可读可写

      printf("shmat success\n");
      strcpy(shmaddr,shmsg);                                      //写入数据进入共享内存

      sleep(5);                                                   //为别的进程读取数据时间,防止在其他进程读取数据之前或者读取数据的时候共享内存被卸载删除

      shmdt(shmaddr);                                            // 释放共享内存
      shmctl(shmId,IPC_RMID,0);                                  //删除共享内存
      printf("quit\n");
      return 0;

}

读取数据的进程:

#include<stdio.h>
#include<stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
//      int shmget(key_t key, size_t size, int shmflg);
//      void *shmat(int shmid, const void *shmaddr, int shmflg);
//       int shmdt(const void *shmaddr);
//       int shmctl(int shmid, int cmd, struct shmid_ds *buf);
int main()
{
      key_t key;
      key = ftok(".",0);

      char  *shmaddr;

      char shmsg[128];

      int shmId = shmget(key,1024*4,0);      //读数据的进程第三个参数设置为0,以读的方式打开。
      if(shmId == -1){

           printf("shmget failure\n");
           exit(-1);
      }

      shmaddr = shmat(shmId,0,0);           //映射进程存储空间。

      printf("read from shm: %s",shmaddr);

      shmdt(shmaddr);                      //释放共享内存,由于在写入数据的进程中已经删除掉共享内存因此读进程不需要再进行删除。
      printf("quit");
      return 0;

}

共享内存使用时,两个进程同时写的时候就会发生错乱,为了控制某一进程写数据时其他进程不会同时进行写入,引入信号。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值