31.命名管道——共享内存
unlink是删除管道文件命名管道写入方没有open那么读取方就要阻塞知道有人打开管道看fifo代码system v通过共享区和物理内存那块4KB进行映射这不加载动态库只映射空间所以进程AB的虚拟地址起始地址就可以访问这块公共区域这叫共享内存。关闭的话进程free虚拟地址空间页表的映射关系也关然后操作系统释放。引用计数很多进程很多管道很多struct file管理如果已经用key创建共享内存了再创建操作系统就知道冲突了A创建时候把KEyy设置进来B拿着在操作系统多个共享内存比较就可以保证A B拿到同一个因为拿着同一个Key。A B约定key我们已经做过了命名管道打开唯一的路径‘’ftok算法可以算出个key值传给shmget另一个进程也用这个生成相同key传给shmget。ftok生成的key是给系统用的而这个shmget返回值是给用户用的看看shm下面comm代码。#pragma once #include iostream #include cstdio #include string #include sys/types.h #include sys/ipc.h #include sys/shm.h const int gdefaultid -1; const int gsize 4096; const std::string pathname .; const int projid 0x66; #define ERR_EXIT(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ } while (0) class Shm { public: Shm() : _shmid(gdefaultid), _size(gsize) { } // 创建的一定要是一个全新的共享内存 void Create() { key_t k ftok(pathname.c_str(), projid); if (k 0) { ERR_EXIT(ftok); } printf(key: 0x%x, k); _shmid shmget(k, _size, IPC_CREAT | IPC_EXCL); if(_shmid 0) { ERR_EXIT(shmget); } printf(shmid: %d, _shmid); } ~Shm() { } private: int _shmid; int _size; };查看共享内存
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2441664.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!