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

焦作网站建设公司排名普陀大型网站建设

焦作网站建设公司排名,普陀大型网站建设,游戏模型外包网站,自适应网站dedecms代码作者主页#xff1a; 作者主页 本篇博客专栏#xff1a;Linux 创作时间 #xff1a;2024年11月2日 命名管道#xff1a; 如果我们想在不相关的进程之间交换数据#xff0c;可以使用FIFO文件来做这项工作#xff0c;它经常被称为命名管道。命名管道是一种特殊类型的文…  作者主页     作者主页 本篇博客专栏Linux 创作时间 2024年11月2日 命名管道 如果我们想在不相关的进程之间交换数据可以使用FIFO文件来做这项工作它经常被称为命名管道。命名管道是一种特殊类型的文件  我们可以使用mkfifo命令来创建一个管道。 然后通过echo往里面写入一段内容 回车之后管道不会关闭在终端2查看可以发现他的内存大小仍然是0当我们在管道2打印出内容后管道就自动关闭了 当我们这样执行的时候我们就可以发现在一直不停的打印我们输入到管道的内容 下面我们在程序里面建立一个管道 返回值为0是成功不为0就是失败。 下面是一个运用命名管道进行通信的例子 Pipe.hpp:(这里是一些的共享的资源包括路径打开管道关闭管道) #include iostream #include string #include unistd.h #include sys/types.h #include sys/stat.h #include fcntl.h using namespace std;const string gpathname ./myfifo; const mode_t gmode 0600; const int gdefault -1; const int gsize 1024; const int gForWrite O_WRONLY; const int gForRead O_RDONLY;int OpenPipe(int flag){int _fd ::open(gpathname.c_str(), flag);if (_fd -1){std::cerr open errno std::endl;return _fd;}return _fd;}void ClosePipeHelper(int fd){if (fd 0)::close(fd);}// class NamePipe // { // private:// public:// };// int CreateNamePipe(string pathname) // { // umask(0); // int n mkfifo(pathname.c_str(), 0600); // if (n ! 0) // { // std::cerr mkfifo errno std::endl; // return -1; // } // return n; // }// class NamePipe // { // public: // NamePipe() // { // } // ~NamePipe() // { // }// private: // const string fifo_path; // int _id; // int _fd; // }; Server.hpp及Server.cc #include Pipe.hppclass Init { public:Init(){umask(0);int n ::mkfifo(gpathname.c_str(), gmode);if (n 0){std::cerr mkfifo errno std::endl;return;}std::cout mkfifo success std::endl;}~Init(){int n ::unlink(gpathname.c_str());if (n ! 0){std::cerr unlink failed std::endl;}std::cout unlink success std::endl;}private: };Init init;class Server { public:Server() : _fd(gdefault){}bool OpenPipeForRead(){_fd OpenPipe(gForRead);if (_fd 0){std::cerr Open cerrno std::endl;return false;}return true;}int RecvPipe(std::string *out){char buffer[gsize];ssize_t n ::read(_fd, buffer, sizeof(buffer) - 1);if (n 0){buffer[n] 0;*out buffer;}return n;}void ClosePipe(){ClosePipeHelper(_fd);}~Server(){}private:int _fd; }; #include Server.hppint main() {Server s;// 打开管道s.OpenPipeForRead();string message;while (1){if (s.RecvPipe(message) 0){std::cout Client Say: message std::endl;}else{break;}}std::cout Client quit,me too std::endl;// 关闭管道s.ClosePipe();return 0; } Client.hpp及Client.cc #include Pipe.hppclass Client { public:Client() : _fd(gdefault){}bool OpenPipeForWrite(){_fd OpenPipe(gForWrite);if (_fd 0)return false;return true;}int SendPipe(const std::string in){return ::write(_fd, in.c_str(), in.size());}void ClosePipe(){if (_fd 0){::close(_fd);}}~Client(){}private:int _fd; }; #include Client.hppint main() {Client c;c.OpenPipeForWrite();while (1){std::string message;std::cout Client Enter: std::endl;std::getline(std::cin, message);c.SendPipe(message);}c.ClosePipe();return 0; } system V共享内存 system V IPC是一种本地通信方案。共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间这些进程间数据传递不再涉及到内核换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存在系统中可以同时存在多份供不同对进程进行通信。 共享内存不是简单的一段内存空间它也要有描述并管理共享内存的数据结构和匹配算法。 共享内存函数  shmget 函数 该函数是系统调用操作系统提供系统调用让我们创建共享内存。 功能用来创建共享内存  参数 key:这个共享内存段名字(由用户形成) size:共享内存大小 shmflg:由九个权限标志构成它们的用法和创建文件时使用的mode模式标志是一样的 常见标志位组合和使用 IPC_CREAT  、IPC_EXCL IPC_CREAT如果你要创建的共享内存不存在就创建。如果存在就获取该共享内存并返回。 IPC_EXCL:单独使用没意义只有和IPC_CREAT组合才有意义 IPC_CREAT | IPC_EXCL如果你要创建的共享内存不存在就创建。如果存在就出错返回。如果成功返回意味着这shm是全新的 key用来标志共享内存可以让进程a和b找到共享内存。 系统提供了随机生成key值的方法ftok 返回值成功则返回共享内存段的标识码失败返回-1 ftok函数  ftok不是系统调用通过我们提供路径和id这两个值可以随便写帮我们生成一个key值。我们给a、b两个进程提供同样的路径和id调用ftok就能形成同样的key就能看到同一个共享内存了。 返回值成功了就返回key值失败就返回-1。 共享内存的释放 共享内存不随着进程的结束而自动释放需要我们手动释放(指令或者其他系统调用)否则会一直存在直到系统重启。 共享内存的生命周期随内核文件的生命周期随进程。 我们可以通过指令ipcs -m 来查看共享内存 可以通过ipsrm -m shmid(自己得到)来释放共享内存 若不想通过指令释放可以通过下面这个函数释放 shmctl 函数 shmid:由shmget返回的共享内存标识码 cmd:将要采取的动作有三个可取值如下图 buf:指向一个保存着共享内存的模式状态和访问权限的数据结构 返回值成功返回0失败返回-1 传IPC_STAT可以获取共享内存的属性传IPC_RMID可以删除共享内存。 key和shmid的比较 key属于用户形成内核使用的一个字段用户不能用key来进行shm的管理。它是内核用来进行区分shm的唯一性的。 shmid内核给用户返回的一个标识符用来进行用户级对共享内存进行管理的id值。 shmat 函数  功能将共享内存段连接到进程地址空间。 如果未来不想使用该共享内存可以用shmdt去关联  参数 shmid: 共享内存标识 shmaddr:指定共享内存想挂接到哪个地址上  shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY 返回值成功返回共享内存的起始地址失败返回-1 shmdt 函数 功能将共享内存段与当前进程脱离 参数 shmaddr: 由shmat所返回的指针 返回值成功返回0失败返回-1 注意将共享内存段与当前进程脱离不等于删除共享内存段 接口使用例子 Client.cc #include Shm.hpp #include namedPipe.hppint main() {// 1. 创建共享内存Shm shm(gpathname, gproj_id, gUser);shm.Zero();char *shmaddr (char *)shm.Addr();sleep(3);// 2. 打开管道NamePiped fifo(comm_path, User);fifo.OpenForWrite();// 当成stringchar ch A;while (ch Z){shmaddr[ch - A] ch;std::string temp wakeup;std::cout add ch into Shm, wakeup reader std::endl;fifo.WriteNamedPipe(temp);sleep(2);ch;}return 0; } Server.cc #include Shm.hpp #include namedPipe.hppint main() {// 1. 创建共享内存Shm shm(gpathname, gproj_id, gCreater);char *shmaddr (char*)shm.Addr();shm.DebugShm();// 2. 创建管道NamePiped fifo(comm_path, Creater);fifo.OpenForRead();while(true){std::string temp;fifo.ReadNamedPipe(temp);std::cout shm memory content: shmaddr std::endl;}sleep(5);return 0; } Shm.hpp #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 int gCreater 1; const int gUser 2; const std::string gpathname /home/whb/code/111/code/lesson22/4.shm; const int gproj_id 0x66; const int gShmSize 4097; // 4096*nclass Shm { private:key_t GetCommKey(){key_t k ftok(_pathname.c_str(), _proj_id);if (k 0){perror(ftok);}return k;}int GetShmHelper(key_t key, int size, int flag){int shmid shmget(key, size, flag);if (shmid 0){perror(shmget);}return shmid;}std::string RoleToString(int who){if (who gCreater)return Creater;else if (who gUser)return gUser;elsereturn None;}void *AttachShm(){if (_addrshm ! nullptr)DetachShm(_addrshm);void *shmaddr shmat(_shmid, nullptr, 0);if (shmaddr nullptr){perror(shmat);}std::cout who: RoleToString(_who) attach shm... std::endl;return shmaddr;}void DetachShm(void *shmaddr){if (shmaddr nullptr)return;shmdt(shmaddr);std::cout who: RoleToString(_who) detach shm... std::endl;}public:Shm(const std::string pathname, int proj_id, int who): _pathname(pathname), _proj_id(proj_id), _who(who), _addrshm(nullptr){_key GetCommKey();if (_who gCreater)GetShmUseCreate();else if (_who gUser)GetShmForUse();_addrshm AttachShm();std::cout shmid: _shmid std::endl;std::cout _key: ToHex(_key) std::endl;}~Shm(){if (_who gCreater){int res shmctl(_shmid, IPC_RMID, nullptr);}std::cout shm remove done... std::endl;}std::string ToHex(key_t key){char buffer[128];snprintf(buffer, sizeof(buffer), 0x%x, key);return buffer;}bool GetShmUseCreate(){if (_who gCreater){_shmid GetShmHelper(_key, gShmSize, IPC_CREAT | IPC_EXCL | 0666);if (_shmid 0)return true;std::cout shm create done... std::endl;}return false;}bool GetShmForUse(){if (_who gUser){_shmid GetShmHelper(_key, gShmSize, IPC_CREAT | 0666);if (_shmid 0)return true;std::cout shm get done... std::endl;}return false;}void Zero(){if(_addrshm){memset(_addrshm, 0, gShmSize);}}void *Addr(){return _addrshm;}void DebugShm(){struct shmid_ds ds;int n shmctl(_shmid, IPC_STAT, ds);if(n 0) return;std::cout ds.shm_perm.__key : ToHex(ds.shm_perm.__key) std::endl;std::cout ds.shm_nattch: ds.shm_nattch std::endl;}private:key_t _key;int _shmid;std::string _pathname;int _proj_id;int _who;void *_addrshm; };#endif 共享内存虽然速度上占有一定优势但是共享内存对内存不会提供任何的保护机制会导致数据不一致的问题即双方不存在谁等谁的情况比如我想传一个hello可能我刚写入一个h就已经被读走了这样就会导致数据不一致的问题我们在访问共享内存时没有任何系统调用所以速度是所有IPC中最快的。 system V消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法每个数据块都被认为是有一个类型接收者进程接收的数据块可以有不同的类型值 消息队列的接口的使用跟共享内存函数很像。 如果要发消息队列的数据用 如果要接收数据用   要查消息队列就用 ipcs -q   它的指令跟共享内存就一字之差 system V信号量 信号量主要用于同步和互斥的。  System V 信号量是由内核维护的一组整数它可以被多个进程同时访问和修改。每个信号量代表一个资源的可用数量进程可以通过对信号量进行操作来控制对资源的访问。信号量的操作包括增加、减少和等待信号量的值达到某个特定条件等。 信号量特点 原子性操作信号量的操作是原子性的这意味着多个进程同时对信号量进行操作时系统会保证操作的完整性和一致性不会出现部分操作完成而其他操作未完成的情况。可用于同步和互斥信号量可以用于实现进程间的同步和互斥。例如可以使用信号量来确保多个进程不会同时访问同一个共享资源或者确保一个进程在某个条件满足之前等待另一个进程完成某个任务。内核维护信号量是由内核维护的这意味着即使进程崩溃或退出信号量的值也不会丢失。当进程重新启动时可以继续使用信号量来控制对共享资源的访问。 进程互斥 由于各进程要求共享资源而且有些资源需要互斥使用因此各进程间竞争使用这些资源进程的这种关系为进程的互斥系统中某些资源一次只允许一个进程使用称这样的资源为临界资源或互斥资源。在进程中涉及到互斥资源的程序段叫临界区  多个执行流进程都能看到的一份资源共享资源 被保护起来的资源临界资源。 用互斥的方式进行保护。 互斥任何时刻只能有一个进程在访问共享资源。 信号量的主要作用是用来保护共享资源的。经过保护共享资源就变成临界资源。 假设上面的方格是电影院的座位。看电影时只要有了票位置就一定是你的而不是谁先坐到就是谁的。 所以成功申请了信号量即使不访问共享资源也会留着一部分资源给你。 这里的信号量也叫多元信号量。 对共享资源的整体使用即资源只有一个也就是有人用了别人就用不了了即互斥。申请信号量时这种信号量叫二元信号量。  信号量也是一个公共资源。 信号量本质是一个计数器申请信号量时计数器--也叫P操作。释放信号量时计数器也叫V操作。 信号量的操作 Linux中允许用户一次申请多个信号量用信号量集保存信号量集用数组来维护。 如果申请了多个信号量上面的nsems就是申请的信号量的个数。 如果信号量不需要了就用 semctl 。 semid就是要删除的信号量集semnum就是要删除的信号量集的下标。  要对信号量进行PV操作就用 semop  。 查看信号量用 ipcs -s 。删除操作跟前面类似。 最后 十分感谢你可以耐着性子把它读完和我可以坚持写到这里送几句话对你也对我 1.一个冷知识 屏蔽力是一个人最顶级的能力任何消耗你的人和事多看一眼都是你的不对。 2.你不用变得很外向内向挺好的但需要你发言的时候一定要勇敢。 正所谓君子可内敛不可懦弱面不公可起而论之。 3.成年人的世界只筛选不教育。 4.自律不是6点起床7点准时学习而是不管别人怎么说怎么看你也会坚持去做绝不打乱自己的节奏是一种自我的恒心。 5.你开始炫耀自己往往都是灾难的开始就像老子在《道德经》里写到光而不耀静水流深。 最后如果觉得我写的还不错请不要忘记点赞✌收藏✌加关注✌哦(ω) 愿我们一起加油奔向更美好的未来愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油为自己点赞
http://www.hkea.cn/news/14439226/

相关文章:

  • 汕头网站建设推广费用网站流量监控
  • .ent做的网站有哪些推广网站免费
  • 洛阳制作网站公司深圳建网站培训机构
  • 网站建设开发模式公司是做小程序还是做网站
  • 有了域名与服务器怎么建网站广州做网站建设哪家公司好
  • 电商直播平台网站开发网站设计有哪几种设计方法
  • 在对方网站做友情链接网站 app建设开发合作协议
  • 金坛建设网站台州网站排名优化公司
  • 水果网站建设策划书网站后台怎么添加代码
  • 网站seo公司哪家好全景网站app
  • 苏州企业网站制作抖音seo培训
  • 重庆企业网站推广服务自建网站套现
  • 有想做企业网站建设网站建设编程语言
  • 网站三要素关键词 描述怎么做莱芜可信赖的网络推广公司
  • 网站未备案可以做经营活动吗深圳企业主页制作
  • 廊坊网站建设外包电商购物平台
  • 私有云网站建设苏州网站建设需要多少钱
  • 申办网站流程铜川免费做网站公司
  • 销售产品做单页还是网站如何申请ip地址和域名
  • 做百度移动端网站排名网上培训
  • 外管局网站先支后收怎么做报告asp.net做网站源代码
  • 云主机安装多个网站桂林到阳朔多少公里
  • 广东企业黄页网站东莞网站建设公司招聘信息
  • 网站建设开发定制无广告免费的影视软件
  • 家居企业网站建设资讯百度旗下13个app
  • 报考建设八大员官方网站建设工程消防验收查询网站
  • 网站建设需求文章凤阳做网站
  • 临桂区建设局网站微信网页宣传网站怎么做的
  • 上海网站建设制作公司seo概念
  • 国内比较好用的建筑案例网站网站开发验收单