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

设置网站默认编码网站建设需要掌握什么知识

设置网站默认编码,网站建设需要掌握什么知识,ui设计模板网站,网站建设开发哪家质量好目录 理解共享内存 Shared memmory code 理解共享内存 前文介绍的管道方式的通信#xff0c;本文介绍的是进程通信的另外一种方式#xff0c;即共享内存。但是这种通信方式的特点是只能本地通信#xff0c;并且不像管道那样有保护机制#xff0c;这里是没有的。 我们通…目录 理解共享内存 Shared memmory code 理解共享内存 前文介绍的管道方式的通信本文介绍的是进程通信的另外一种方式即共享内存。但是这种通信方式的特点是只能本地通信并且不像管道那样有保护机制这里是没有的。 我们通过这个图引出我们今日的话题 在Linux中万物皆是文件的概念已经深深的刻入到了我们的大脑里面在文件系统里面我们介绍了进程介绍了地址空间介绍了页表介绍了物理内存之间的映射关系知道了代码和数据的地址通过页表将虚拟地址和物理地址完美联系在了一起那么物理内存里面是否存在进程间通信需要的空间 -- 共享内存呢 当然是存在的其实在动静态库的部分我们就知道了动态库就是将库的内容加载到了物理内存上不同间的进程通过页表可以找到对于的库的内容这在博主看来其实是一种共享内存可是共享内存的开辟由谁来做怎么知道共享内存开辟的空间的地址 上面两个问题对应的操作其实都是由OS来完成的但是OS是肯定不能自己来完成的因为OS是要根据用户的需求实施对应的操作所以这两个操作OS给我们提供了系统调用由我们用户来执行即可。 那么新的问题来了是否存在多个共享内存如果存在多个共享内存那么OS是否有必要对共享内存进行管理如果要实施管理OS是如何进行管理的 对于第一个问题答案是肯定的因为不只是有AB两个进行需要使用共享内存进行通信还有CD还有EF需要使用共享内存进行通信。 对于第二个问题OS肯定是有必要对共享内存进行管理的不然内存导致的问题由谁来负责呢 对于第三个问题我们直接call back前面的文件部分了想要对某种对象进行管理那么使用到的一定是六字真言先描述再组织 在Linux源码里面是有共享内存对应的结构体的这里因为不介绍所以不放出对应的源码了肯定就有人说了怎么又又又是结构体因为Linux就是C语言写的呀并且C语言想要对某个对象管理结构体不是最好的选择吗 所以我们得出一个结论共享内存 共享内存的数据 共享内存的属性 那么我们现在就可以直接进入到了代码部分了。 Shared memmory code 对于共享内存的代码我们使用的是和命名管道一样的方式一个客户端一个服务端一个hpp文件我们首先最关心的就是如何创建共享内存 也就是第一个问题使用的系统调用是2号手册的shmget 对于头文件部分不用解释对于三个参数部分一个是key_t类型的key一个是size一个是shmflg。 size代表的是开辟的共享内存的大小对于shmflg也就是共享内存的标志我们这里就介绍两个常用的一个是IPC_CREAT 一个是IPC_EXCL使用时候我们可以分为IPC_CREAT使用IPC_EXCL单独使用没有意义IPC_CREAT | IPC_EXCL使用。 对于第一种模式IPC_CREAT代表的是如果创建的共享内存不存在就创建如果存在共享内存就获取该共享内存并返回说白了就是总能够获取一个共享内存但是不一定是全新的。 对于第二种模式IPC_CREAT | IPC_EXCL代表的是如果创建的共享内存不存在就创建如果存在了对应的共享内存就出错返回也就是说这个模式获取到的共享内存一定是全新的。 最后一个参数key我们首先思考一个问题开辟了共享内存之后进程通过什么方式知道共享内存呢难道是A进程开辟了这个共享内存然后打电话给B进程说喂我开辟了一个共享内存地址是0x34381fec。这样肯定是不可以了因为我们探究的就是进程通信这还没有通信呢怎么让他们告知对方呢 所以获取共享内存标识符的方法是不能让进程生成的肯定是要让用户自己形成的所以需要介绍到一个函数为ftok 我们需要给一串路径一个id那么在ftok内部就可以通过某种算法实现key的生成。 那么对于函数shmget的返回值的描述是 返回的值如果成功了返回的是共享内存的唯一标识符如果开辟共享内存失败了返回的就是就是-1。 话不多说我们先创建一个并且打印出来看看 const char *pathname /home/lazy/linux/lower_code/shm; const int proj_id 0x11; std::string ToHex(key_t key) {char buffer[128];snprintf(buffer, sizeof(buffer), 0x%x, key);return buffer; }int main() {key_t key ftok(pathname, proj_id);int shmid shmget(key, 4096, IPC_CREAT | IPC_EXCL);std::cout key: ToHex(key) shmid shmid std::endl;return 0; }转换为16进制是为了后面方便观察我们使用混合模式创建了共享内存 最开始使用宏只有IPC_CREAT后面使用了IPC_EXCL我们会发现前面创建的共享内存还是存在所以会报错可是明明我们的进程已经结束了为什么共享内存还在呢 所以我们得出一个结论共享内存的生命周期不随进程终止而终止。那么后面就势必会牵扯到共享内存的回收问题。 我们通过代码系统调用的方式已经能成功创建了但是我们想拿出来看看怎么办我们使用命令行ipcs -m就可以进行查看相关信息了 其中key是16进程的所以我们前面会转成16进程的方便观察shmid是0owner是lazyperms权限为0共享内存的大小是4096nattch对应的是0代表的意思是挂接的进程为0status状态。 那么我们想要删除使用的命令是ipcrm这里提问了就我们使用key删除还是shmid进行删除呢 当然是shmid了对于key不过是共享内存的一个标识符告诉OS可以通过key来找到对应的共享内存对于shmid是可以实现用户级别进行管理的一个值所以我们作为用户肯定是通过shmid进行管理的 这样就行了。 说了那么多我们对共享内存的函数也了解了我们也是时候应该对它进行一些封装了。 因为我们是用C语言实现的所以仍然使用类的方式进行实现 #ifndef __SHM_HPP__ #define __SHM_HPP__ #include iostream #include string #include cerrno #include cstdio #include cstring #include sys/ipc.h #include sys/shm.h #include unistd.hconst char* pathname /home/lazy/linux/lower_code/shm; const size_t shm_size 4096; const int proc_id 0x66;class shm { public:private:key_t _key;int _shmid;std::string _pathname;int proc_id;};#endif 先将基本的框架搭建好。  然后首先构造函数部分因为key _shmid都是用户层面自己提供的所以我们在构造函数提供。 并且考虑到分为了服务端和用户端我们就可以新增一个_who用来表明身份。 shm(const std::string pathname, int proc_id, int who):_pathname(pathname),_proc_id(proc_id),_who(who){} 那么获取到id我们如果在构造函数里面直接写就有点不美观了我们可以单独封装一个函数出来 key_t Getkey(){key_t key ftok(_pathname.c_str(), _proc_id);if (key 0){perror(ftok);}return key;} 并且因为这个函数是用来获取key的用户不应该直接调用所以为了增加用户的体验我们应该将这种类型的函数设置为私有的。 // 获取shmidint GetShmid(key_t key, size_t size, int shmflg){int shmid shmget(key, size, shmflg);if (shmid 0){perror(shmget);}return shmid;}// Creater的封装bool GetUserForCreate(){if (_who Creater){_shmid GetShmid(_key, shm_size, IPC_CREAT | IPC_EXCL | 0666);if (_shmid 0)return true;}std::cout shm fail create... std::endl;return false;} 对于Creater获取shmid我们仍然是在构造函数里面实现并且简单的通过两层封装实现在IPC_EXCL后面的0666本质上是permission这里暂时先不用管。 那么对于Creater的函数到这里了对于user来说构造函数还没有实现我们要清楚user使用该类的时候要干什么好吧其实也没有什么特别要干的只是它需要知道shmid罢了。 // user的封装bool GetUserForUser(){if (_who User){_shmid GetShmid(_key, shm_size, IPC_CREAT | IPC_EXCL | 0666);if (_shmid 0)return true;}std::cout shm fail create... std::endl;return false;} 就像这样。 较为完整的构造函数就是 Shm(const std::string pathname, int proc_id, int who): _pathname(pathname), _proc_id(proc_id), _who(who){_key Getkey();if (_who Creater)GetUserForCreate();elseGetUserForUser();} 那么我们不妨使用server来试试  #include shm.hpp #include iostreamint main() {//创建共享内存Shm shm(pathname,proc_id,Creater);return 0; } 那么实验成功了但是这里提问 到现在位置进程这里是否开始通信呢 答案是没有 因为进程之间使用共享内存是要进行挂接的也就是将共享内存的地址給进程。 那么我们得知道地址吧 shmid这是由shmget函数返回的共享内存对象的系统标识符。shmaddr这是一个可选参数用于指定共享内存区域在进程的虚拟地址空间中的起始地址。如果设置为NULL则由系统选择地址。shmflg这是一个标志参数用于控制连接的行为。例如它可以指定是否允许共享内存区域在调用进程的地址空间中固定位置或者是否允许读写访问等 那么为了获得地址我们在类的私有成员变量里面新增一个_addrshm。 // 获取共享内存的地址void *AttachShm(){void *shmaddr shmat(_shmid, nullptr, 0);if (shmaddr nullptr){perror(shmat);}return shmaddr;} 并且在构造函数里面使用一个函数用来初始化_addrshm。 可是当我们不再想使用该内存了我们就可以使用函数shmdt将该共享内存空间分离出去也就是当_addrshm不为空的时候 // 获取共享内存的地址void *AttachShm(){if (_addrshm ! nullptr)DetachShm(_addrshm);void *shmaddr shmat(_shmid, nullptr, 0);if (shmaddr nullptr){perror(shmat);}return shmaddr;}void DetachShm(void *shmaddr){if(shmaddr nullptr)return;shmdt(shmaddr);} 这样地址我们就知道了可是仍然没有挂接上挂接使用的函数是shmctl: 其中也有共享内存的结构体信息 有了地址就可以通信了。 那么通信只需要server和client端口都获取到共享内存的地址就可以了 #include shm.hppint main() {//创建共享内存Shm shm(pathname,proc_id,creater);char* shmaddr (char*)shm.Addr();while(true){std::cout shm memory content: shmaddr std::endl;sleep(1);}return 0; } #include shm.hppint main() {Shm shm(pathname, proc_id, user);shm.Zero();char *shmaddr (char *)shm.Addr();char ch A;while (ch Z){shmaddr[ch - A] ch;std::cout client write ch std::endl;sleep(2);ch;}return 0; } 主要操作是shmaddr获取到地址获取到了地址就可以了那么为了方便观察我们使用sleep函数休眠上一秒两秒。 现象就是 它都不带有任何保护机制的所以server端是在一直读取这也就是为什么快了它不像管道那样约束很多所以我们可以在共享内存里面引入管道也就是增加管道机制即可。 具体实现交给大家了~ 感谢阅读
http://www.w-s-a.com/news/789060/

相关文章:

  • 普陀做网站价格wordpress接入qq互联
  • 网站2级页面怎么做杭州哪家做外贸网站
  • 做了静态网站怎么显示在互联网上营销策划与运营方案
  • 常见的英文网站国内军事新闻大事件
  • 傻瓜式做网站程序微信怎么开公众号
  • c2c电商网站wordpress仿36kr主题
  • 网站建设公司开发免费图纸网站
  • 一个网站页面设计多少钱做预算查价格的网站是哪个
  • 鳌江哪里有做网站百度短链接在线生成
  • 有没有什么做水利资料的网站杭州建设信用平台
  • 电子商务网站建设及推广方案论文wordpress无法显示文章
  • 建设工程监理网站前端和后端分别需要学什么
  • 公司网站制作效果国内最好的在线网站建设
  • 徐州好点的做网站的公司有哪些wordpress 工具插件下载
  • 如何用云服务器建设网站微网站免费开发平台
  • 官网的网站设计公司做网站需要准备哪些东西
  • 程序员和做网站那个好找工作wordpress二维码 插件
  • 湖南城市建设技术学院官方网站青海省建设局网站
  • 响应式网站有什么区别百度网站官网
  • 金华企业自助建站系统长沙建站公司模板
  • 云主机 做网站友情链接网站
  • 定制型网站设计天津网站模板建站
  • 为什么公司网站打开很慢wordpress汉化插件
  • 用dw做教学网站做网站用什么配置笔记本
  • 秦皇岛网站制作服务无网站无产品链接如何做SOHO
  • 国际婚恋网站做翻译合法吗南宁网络推广有限公司
  • 济南做网站公司排名销售市场规划方案
  • 营销型网站定制珠海建站网站
  • 企业网站代码wordpress页面重定向循环
  • 厦门网站建设哪家便宜用wordpress做企业网站