当前位置: 首页 > news >正文

网站设计主要包含3个方面沧州网络推广外包公司

网站设计主要包含3个方面,沧州网络推广外包公司,手机上如何制作app,公司做网站怎么推广文章目录 共享内存原理申请共享内存函数#xff08;shmget#xff09;参数key生成key值示例申请共享内存 挂接到进程地址空间函数(shmat)去关联函数(shmdt)控制共享内存(shmctl)IPC_STATIPC_RMID ipcs其余进程获取该共享内存进程间通信 进程间通信#xff1a;IPC#xff0c… 文章目录 共享内存原理申请共享内存函数shmget参数key生成key值示例申请共享内存 挂接到进程地址空间函数(shmat)去关联函数(shmdt)控制共享内存(shmctl)IPC_STATIPC_RMID ipcs其余进程获取该共享内存进程间通信 进程间通信IPCInter Process Communication 共享内存原理 进程之间通信的本质是让不同的进程看到同一份资源。 无论是匿名管道还是命名管道的通信我们都是在内核空间里的缓冲区进行实现的进程通信对于这种方式在用户输入时我们在内核空间缓冲区中进行通信然后再写入物理内存那么我们是否可以做到直接让进程在物理内存中进行进程间的通信呢 每一个进程都有一个虚拟内存(地址)他们通过页表将虚拟地址映射到物理地址上因此我们可以让操作系统帮我们在物理内存申请一段空间然后通过页表把这份空间映射到虚拟内存的共享区这样我们就做到了让不同的进程看到了同一份资源。 申请共享内存函数shmget shmget:shared memory get就是获取共享内存 参数 key这个共享内存段名字 size需要创建的共享内存的大小 shmflg:通过类似位图实现的多操作整数 IPC_CREAT单独如果你申请的共享内存不存在存在就获取返回 IPC_CREAT | IPC_EXCL如果你申请的共享内存不存在就创建存在就出错返回。这是为了确保我们申请的共享内存一定是一个新的没有被别人使用 IPC_EXCL不单独使用 这段共享内存的权限千万不要忘记或上 | 权限不然后面就会导致进程挂接不上 //申请共享内存 int shmid shmget(key, NUM, IPC_CREAT | 0666);//返回值为共享内存标识符返回值 共享内存标识符 参数key key是一个数字这个值是随机的关键是这个随机数在内核中具有唯一性可以让他对不同的进程拥有唯一的标识第一个进程创建出key之后后面的进程只要有了这个key,就可以拿着这个key去和其它进程进行共享内存了。举个例子这个key就相当于是一把钥匙而这个共享内存就是一把锁只要不同的进程拿着这个钥匙就可以打开这个内存了。那么现在的问题是我们怎么去生成这个key值呢又这么保证它在内核中具有唯一性呢 系统中什么具有唯一性呢?对就是路径路径就有唯一性因此我们可以通过一个函数把路径作为参数传给这个函数函数根据一定的算法帮助我们生成这个key。 库里面给我们提供了生成key的函数ftok() 参数 pathname文件路径 proj_id项目id我们给定的一个int值目的就是为了和文件路径一起通过一系列的算法生成一个唯一key值 作用ftok函数通过给的路径和int值就可以帮我们生成一个在内核中具有唯一性的值。 返回值 成功返回key失败返回-1并设置错误码 key存在哪里呢系统中一定有很多的共享内存操作系统要想把他们管理起来就要先描述再组织因此key一定被存在共享内存的描述对象中。 生成key值示例 #include sys/types.h #include sys/ipc.h #include iostreamusing namespace std;#define PATHNAME ./common.cc #define PROJ_ID 0x8888int main() {key_t key ftok(PATHNAME, PROJ_ID);if(key -1){perror(ftok error);exit(0);}cout key endl;return 0; }所给的路径一般是当前文件的路径当然也可以给其他文件的但为了保证唯一性我们一般在哪个路径下生成key就使用哪个路径但前提是所给的文件路径一定是存在的如果不存在就会生成失败。 申请共享内存 //申请共享内存方式1 int shmid shmget(key, 1024, IPC_CREAT 0666); //申请共享内存方式2 int shmid shmget(key, 1024, IPC_CREAT|IPC_EXCL 0666); 问题我们绕了一大圈生成的这个shmid和key都是具有唯一性的那么我们为什么不直接用key呢非要再去通过给shmget函数传key生成呢 key是用于在操作系统内标定唯一性而shmid是共享内存标识符只存在于我们的进程内用来表示资源的唯一性 共享内存的大小一般是40964KB的整数倍,虽然我们这里申请的是1024其实系统给我们的就是4096因为操作系统是按4KB为单位对我们进行分配的需要注意的是我们只能用1024多给的我们不可以使用用了就是越界可能会出现错误 挂接到进程地址空间函数(shmat) shmatshared memory attach 返回值为挂接到虚拟地址中的哪个位置 上面我们只是在物理内存中申请了一份共享内存但是我们还要去把该共享内存挂接到进程地址空间的共享区中如何做到呢通过shmat函数来实现 参数 shmid就是申请共享内存函数shmget的返回值共享内存标识符 shmaddr:让申请的共享内存挂到共享区的哪一个位置(地址)设置成nullptr就是让系统进行决定 shmflg进程以什么方式去挂接这个共享内存 shmaddr为NULL核心自动选择一个地址 shmaddr不为NULL且shmflg无SHM_RND标记则以shmaddr为连接地址。 shmaddr不为NULL且shmflg设置了SHM_RND标记则连接的地址会自动向下调整为SHMLBA的整数倍。公式shmaddr - (shmaddr % SHMLBA) shmflgSHM_RDONLY表示连接操作用来只读共享内存 返回值返回一个void类型的指针指向在物理内存中申请的共享内存在虚拟地址中共享内存的起始地址 共享内存指在物理内存中申请的共享内存 共享区指在虚拟内存中的共享区域 去关联函数(shmdt) dtdelete touch 给虚拟内存共享区挂接的物理内存如果进程结束系统会自动取消关联但是我们现在不想等到进程结束想要在进程还在运行时就去关联怎么做呢 通过函数shmdt()就可以做到去关联 参数 const void* shmaddr:就是在物理内存申请的共享内存挂接到共享区的起始地址也就是函数shmat的返回值。 返回值 成功返回0失败返回-1并设置错误码 注意将共享内存段与当前进程脱离不等于删除共享内存段。 //去关联 shmdt(shmaddr);控制共享内存(shmctl) 参数 shmid共享内存标识符就是我们通过shmget函数得到的返回值。 cmd控制这个函数去做什么 buf指向一个保存着共享内存的模式状态和访问权限的数据结构 返回值 成功返回0失败返回-1 其中参数cmd有三个取值如下 IPC_STAT 用于获取管理该共享内存结构中的数据这个共享内存的key值关联个数等数据 struct shmid_ds shmds; shmctl(shmid, IPC_STAT, shmds); cout shm size: shmds.shm_segsz endl; cout shm nattch: shmds.shm_nattch endl; printf(shm key: 0x%x\n, shmds.shm_perm.__key); cout shm mode: shmds.shm_perm.mode endl; IPC_RMID 删除共享内存选项 shmdt函数只是把进程和该共享内存的关系从也表中删除从而取消关联但是我们在物理内存中申请的共享内存并没有被释放因此我们可以通过shmctl来释放对应的共享内存 ipcs 如果不通过shmctl来释放对应的共享内存那么即使进程结束该共享内存仍然是被占用的因此我们可以手动的来释放该共享内存操作如下 此时只是去关联了但是该共享内存仍然被占用没有被释放 通过ipcrm -m选项 对应的共享内存标识符来释放该共享内存 其余进程获取该共享内存 只需要创建一次共享内存其余的进程只需拿着这个共享内存的标识符就可以得到这个共享内存了 #include sys/types.h #include sys/ipc.h #include iostream #include sys/shm.h #include unistd.h#include log.hppusing namespace std;#define PATHNAME /home/Linux3 #define PROJ_ID 0x6666 #define NUM 1024key_t GetKey() {//生成参数唯一key值key_t key ftok(PATHNAME, PROJ_ID);if(key -1){perror(ftok error);exit(0);}return key; }int GetShareMemHelper(int flag) {key_t key GetKey();int shmid shmget(key, NUM, flag);//返回值为共享内存标识符return shmid; }//创建第一个共享内存 int CreatShm() {return GetShareMemHelper(IPC_CREAT |IPC_EXCL | 0666); }//获取已经创建好的共享内存 int GetShm() {return GetShareMemHelper(IPC_CREAT); }#include common.hppint main() {int shmid GetShm();//自定义函数用于获取已经创建好的共享内存char* shmaddr (char*)shmat(shmid, nullptr, 0);sleep(5);shmdt(shmaddr);sleep(2);shmctl(shmid, IPC_RMID, nullptr);return 0; }进程间通信 此时我们就可以向该共享内存写入了而不是先写入缓冲区再讲缓冲区数据拷贝到内存其它进程就直接从该共享内存进行读取就可以了。 但是此时会有一个问题就是共享内存对于不同进程而言不是同步的即写进程还没写读进程就从共享内存中读此时读到的为空或者上次的就一直在那打印因此我们要让进程同步等写进程写入了读进程才开始读这里举个例子我们可以通过管道来实现进程同步因为read函数如果没有读取到就会一直等待 char c c; while(1) {fgets(shmaddr, 1024, stdin);write(fd, c, 1);//向命名管道写入信息用来通知读进程可以从共享内存中读取了//通过命名管道使得进程a,b同步}Init init; int fd open(FIFO_FILE, O_RDONLY); char c; while (1) {ssize_t n read(fd, c, 1);//等待通知信息如果没有就退出if(n 0){break;}cout shmaddr; }创建一个管道当向共享内存写入时该进程通过write函数向管道中写入数据对于读进程如果一直没有read到就会一直等待当读到了才会向下执行代码这里管道的作用就是为了实现进程同步。
http://www.tj-hxxt.cn/news/229456.html

相关文章:

  • 番禺网站(建设信科网络)手机ppt制作
  • 佛山住房和城乡建设厅网站大连旧房翻新装修哪家公司好
  • 广州seo网站开发徐州在线网
  • 建游戏网站网站开发所要达到的目标
  • 德令哈网站建设公司阿里云轻量服务器wordpress
  • 手机端网站建设郑州h5自己制作模板
  • asp.net网站开发书籍营销型建设
  • 网站服务器解决方案如何做网站站内搜索
  • 电子技术支持 东莞网站建设网站开发合同管辖权异议
  • 12306网站开发语言原创 网站 源码
  • 手机建造网站做网站的厉害还是黑网站的厉害
  • 石家庄的网站公司wordpress社群模板
  • 网站建设需要包含什么网站如何验收
  • 网站退出率是什么意思wordpress 表单 入库
  • 班级网站如何去建设桂林网站优化价格
  • 莱芜市城乡建设局网站首页湖南畅想网站建设
  • 连云港做网站网站做百度联盟收入已经很低了
  • 店面门头设计网站jsp网站开发的mvc
  • 陕西四通建设工程有限责任公司网站浙江省国有建设用地使用权建议网站
  • 有没有人一起做网站做网站服务器哪种好
  • 珠海公司网站建设建个简单的网站
  • 网站域名过期了怎么办vue网站引导页怎么做
  • 个人网站怎么设计wordpress4.7
  • 陕西 汽车 网站建设wordpress+云播插件
  • 优秀 网站设计 蓝色网站设计怎么做图片透明度
  • 深度科技商业官方网站wordpress固定链接标签加上页面
  • vue可以做pc的网站申请网站空间有哪几种方式
  • 网站建设推广关键词app平台开发定制软件
  • 网站建设中应该注意什么自己做的网站和ie不兼容
  • 建站最好的公司排名域名服务器没有该网站的域的列表