Linux 进程间通讯之共享内存方式

共享内存方式:从物理内存里面拿出来一部分作为多个进程共享。

共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入数据,共享这个内存的所有进程都可以立即看到其中内容。

 

共享内存实现步骤:

一、创建共享内存,使用shmget函数。

二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。

 

创建共享内存shmget

intshmget(key_t key, size_t size, int shmflg)

功能:得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符。

key: 0(IPC_PRIVATE)会建立共享内存对象

size:大于0的整数,新建共享内存的大小,以字节为单位。只获取共享内存时,指定为0.

shmflg:

         0表示取共享内存标识符,如不存在则函数会报错;

         IPC_CREAT如果内核中不存在键值与key相等的共享内存时,则创建一个共享内存;如果存在这样的共享内存则返回共享内存的标识符;

         IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的共享内存,则新建一个消息队列;如果存在这样的共享内存则报错;

函数返回值:成功则返回内存的标识符;出错则返回-1,错误原因存在于error

 

映射共享内存到调用进程的地址空间shmat

void*shmat(int shmid, const void *shmaddr, int shmflg)

msqid:共享内存标识符

shmaddr:指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置。

shmflg: SHM_RDONLY 只读模式,其他为读写模式

函数返回值:成功则返回附加好的共享内存地址;出错返回-1错误原因存在于error

 

断开共享内存连接shmdt

intshmdt(const void *shmaddr)

功能:传入shmaddr,连接共享的内存起始地址;断开成功则返回0,出错则返回-1错误原因存在于error中。

 

父子进程间通讯实例:

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <stdlib.h>

 

int main(int argc, char **argv){

         if(argc< 2){                                   //需要输入共享的数据

                   printf("pleaseinput the shared data.\n");

                   exit(-1);

         }

         intshmid;

         shmid= shmget(0,1024,IPC_CREAT);

         if(shmid== -1){                            //申请共享内存失败

                   printf("createshare memory failed.\n");

                   exit(-1);

         }

         if(fork()){                                        //父进程之中

                   char*p_shmaddr;

                   p_shmaddr= shmat(shmid, NULL, 0);     //映射到父进程之中的一个地址

                   memset(p_shmaddr,0, 1024);                  //初始化共享内存

                   strcpy(p_shmaddr,argv[1]);                      //拷贝共享数据到共享内存

                   wait(NULL);                                                    //等待子进程结束

                   exit(0);

         }

         else{

                   sleep(2);                                                          //等待父进程写入数据

                   char*c_shmaddr;

                   c_shmaddr= shmat(shmid,NULL,0);       //映射到子进程之中一个地址,具体由kernel指配

                   printf("theshare data is: %s\n", c_shmaddr);        //子进程输出共享的数据

                   exit(0);

         }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值