linux共享内存存在于进程空间的什么位置

 我来答
匿名用户
2016-11-22
展开全部
  共享内存方式:从物理内存里面拿出来一部分作为多个进程共享。   共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入数据,共享这个内存的所有进程都可以立即看到其中内容。   共享内存实现步骤:   一、创建共享内存,使用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_CREATIPC_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   #include   #include   #include   #include   #include   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: %sn", c_shmaddr); //子进程输出共享的数据   exit(0);   }   }
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式