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

天进机械东莞网站建设如何将自己做网站放上网

天进机械东莞网站建设,如何将自己做网站放上网,网站建设公司排行杭州,酒泉网站建设哪家好文章目录 1. 共享内存示意图2. 共享内存数据结构3. 共享内存函数shmgetshmatshmdtshmctl 4. 实例代码测试共享内存5. 共享内存相关命令6. System V 消息队列#xff08;了解#xff09;7. System V 信号量#xff08;了解#xff09; 共享内存区是最快的 IPC 形式。一旦这样… 文章目录 1. 共享内存示意图2. 共享内存数据结构3. 共享内存函数shmgetshmatshmdtshmctl 4. 实例代码测试共享内存5. 共享内存相关命令6. System V 消息队列了解7. System V 信号量了解 共享内存区是最快的 IPC 形式。一旦这样的内存映射到共享它的进程的地址空间这些进程间数据传递不再涉及到内核换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 1. 共享内存示意图 2. 共享内存数据结构 struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kernel_time_t shm_ctime; /* last change time */__kernel_ipc_pid_t shm_cpid; /* pid of creator */__kernel_ipc_pid_t shm_lpid; /* pid of last operator */unsigned short shm_nattch; /* no. of current attaches */unsigned short shm_unused; /* compatibility */void *shm_unused2; /* ditto - used by DIPC */void *shm_unused3; /* unused */ };3. 共享内存函数 shmget 功能用来创建共享内存 原型int shmget(key_t key, size_t size, int shmflg); 参数key这个共享内存段名字size共享内存大小shmflg由九个权限标志构成它们的用法和创建文件时使用的 mode 模式标志是一样的 返回值成功返回一个非负整数即该共享内存段的标识码失败返回-1shmat 功能将共享内存段连接到进程地址空间 原型void* shmat(int shmid, const void* shmaddr, int shmflg); 参数shmid共享内存标识shmaddr指定连接的地址shmflg它的两个可能取值是 SHM_RND 和 SHM_RDONLY 返回值成功返回一个指针指向共享内存的地址失败返回-1说明 shmaddr 为 NULL核心自动选择一个地址。 shmaddr 不为 NULL 且 shmflg 无 SHM_RND 标记则以 shmaddr 为连接地址。 shmaddr 不为 NULL 且 shmflg 设置了 SHM_RND 标记则连接的地址会自动向下调整为 SHMLBA 的整数倍公式shmaddr - (shmaddr % SHMLBA)。 shmflg SHM_RDONLY表示连接操作用来只读共享内存。shmdt 功能将共享内存段与当前进程脱离 原型int shmdt(const void* shmaddr); 参数shmaddr由 shmat 所返回的指针 返回值成功返回0失败返回-1 注意将共享内存段与当前进程脱离不等于删除共享内存段shmctl 功能用于控制共享内存 原型int shmctl(int shmid, int cmd, struct shmid_ds* buf); 参数shmid由 shmget 返回的共享内存标识码cmd将要采取的动作有三个可取值buf指向一个保存着共享内存的模式状态和访问权限的数据结构 返回值成功返回0失败返回-14. 实例代码测试共享内存 使用共享内存通信一定是一个进程创建新的 shm另一个直接获取共享内存即可。 代码结构 $ ls Comm.hpp Fifo.hpp Makefile ShmClient.cc ShmServer.cc$ cat Makefile .PHONY:all all:shm_client shm_servershm_server:ShmServer.ccg -o $ $^ -stdc11 shm_client:ShmClient.ccg -o $ $^ -stdc11.PHONY:clean clean:rm -f shm_client shm_serverFifo.hpp #ifndef __COMM_HPP__ #define __COMM_HPP__#include iostream #include string #include cerrno #include cstring #include sys/types.h #include sys/stat.h #include unistd.h #include fcntl.h #include cassertusing namespace std;#define Mode 0666 #define Path ./fifoclass Fifo { public:Fifo(const string path Path): _path(path){umask(0);int n mkfifo(_path.c_str(), Mode);if (n 0){cout mkfifo success endl;}else{cerr mkfifo failed, errno: errno , errstring: strerror(errno) endl;}}~Fifo(){int n unlink(_path.c_str());if (n 0){cout remove fifo file _path success endl;}else{cerr remove failed, errno: errno , errstring: strerror(errno) endl;}}private:string _path; // 文件路径 文件名 };class Sync { public:Sync(): rfd(-1), wfd(-1){}void OpenReadOrDie(){rfd open(Path, O_RDONLY);if (rfd 0)exit(1);}void OpenWriteOrDie(){wfd open(Path, O_WRONLY);if (wfd 0)exit(1);}bool Wait(){bool ret true;uint32_t c 0;ssize_t n read(rfd, c, sizeof(uint32_t));if (n sizeof(uint32_t)){std::cout server wakeup, begin read shm... std::endl;}else if (n 0){ret false;}else{return false;}return ret;}void Wakeup(){uint32_t c 0;ssize_t n write(wfd, c, sizeof(c));assert(n sizeof(uint32_t));std::cout wakeup server... std::endl;}~Sync(){}private:int rfd;int wfd; };#endifComm.hpp #pragma once#include iostream #include cerrno #include cstring #include cstdlib #include string #include sys/ipc.h #include sys/shm.h #include sys/types.husing namespace std;const char *pathname /home/ubuntu; const int proj_id 0x66;// 在内核中共享内存的大小是以4KB为基本单位的你只能用你申请的大小。建议申请大小是N*4KB const int defaultsize 4096; // 单位是字节std::string ToHex(key_t k) {char buffer[1024];snprintf(buffer, sizeof(buffer), 0x%x, k);return buffer; }key_t GetShmKeyOrDie() {key_t k ftok(pathname, proj_id);if (k 0){std::cerr ftok error, errno: errno , error string: strerror(errno) std::endl;exit(1);}return k; }int CreateShmOrDie(key_t key, int size, int flag) {int shmid shmget(key, size, flag);if (shmid 0){std::cerr shmget error, errno: errno , error string: strerror(errno) std::endl;exit(2);}return shmid; }int CreateShm(key_t key, int size) {// IPC_CREAT: 不存在就创建存在就获取// IPC_EXCL: 没有意义// IPC_CREAT | IPC_EXCL: 不存在就创建存在就出错返回return CreateShmOrDie(key, size, IPC_CREAT | 0666); }int GetShm(key_t key, int size) {return CreateShmOrDie(key, size, IPC_CREAT); }void DeleteShm(int shmid) {int n shmctl(shmid, IPC_RMID, nullptr);if (n 0){std::cerr shmctl error std::endl;}else{std::cout shmctl delete shm success, shmid: shmid std::endl;} }void ShmDebug(int shmid) {struct shmid_ds shmds;int n shmctl(shmid, IPC_STAT, shmds);if (n 0){std::cerr shmctl error std::endl;return;}std::cout shmds.shm_segez: shmds.shm_segsz std::endl;std::cout shmds.shm_nattch: shmds.shm_nattch std::endl;std::cout shmds.shm_ctime: shmds.shm_ctime std::endl;std::cout shmds.shm_perm.__key: ToHex(shmds.shm_perm.__key) std::endl; }void *ShmAttach(int shmid) {// 核心自动选择一个地址void *addr shmat(shmid, nullptr, 0);if ((long long int)addr -1){std::cerr shmat error std::endl;return nullptr;}return addr; }void ShmDetach(void *addr) {int n shmdt(addr);if (n 0){std::cerr shmdt error std::endl;} }ShmServer #include Comm.hpp #include Fifo.hppint main() {// 1. 获取keykey_t key GetShmKeyOrDie();std::cout key: ToHex(key) std::endl;// 2. 创建共享内存int shmid CreateShm(key, defaultsize);std::cout shmid: shmid std::endl;// 4. 将共享内存和进程进行挂接关联char *addr (char *)ShmAttach(shmid);std::cout Attach shm success, addr: ToHex((uint64_t)addr) std::endl;// 0. 先引入管道Fifo fifo;Sync syn;syn.OpenReadOrDie();// 可以进行通信了for (;;){if (!syn.Wait())break;std::cout shm content: addr std::endl;}ShmDetach(addr);std::cout Detach shm success, addr: ToHex((uint64_t)addr) std::endl;// 3. 删除共享内存DeleteShm(shmid);return 0; }ShmClient #include Comm.hpp #include Fifo.hppint main() {key_t key GetShmKeyOrDie();std::cout key: ToHex(key) std::endl;int shmid GetShm(key, defaultsize);std::cout shmid: shmid std::endl;char *addr (char *)ShmAttach(shmid);std::cout Attach shm success, addr: ToHex((uint64_t)addr) std::endl;memset(addr, 0, defaultsize);Sync syn;syn.OpenWriteOrDie();// 可以进行通信了for (char c A; c Z; c) // shm没有使用系统调用{addr[c - A] c;syn.Wakeup();sleep(1);}ShmDetach(addr);std::cout Detach shm success, addr: ToHex((uint64_t)addr) std::endl;sleep(5);return 0; }结果演示 5. 共享内存相关命令 共享内存如果进程结束我们没有主动释放它则共享内存一直存在。共享内存的生命周期是随内核的只有重启系统它才会自行销毁。为了更好地控制共享内存我们要会使用命令删除它。不管是指令还是代码想对共享内存进行控制都需要使用 shmid shmid 是共享内存的唯一性标识 # 查看共享内存 ipcs -m# 删除指定共享内存 ipcrm -m [shmid]# 实机演示 $ ipcs -m------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 0 root 644 80 2 0x00000000 1 root 644 16384 2 0x00000000 2 root 644 280 2 0x6602fc97 10 ubuntu 666 4096 1$ ipcrm -m 10 # 指定shmid即可删除该共享内存资源注意不是必须通过手动来删除这里只是为了演示相关指令删除共享内存资源是进程该做的事情。 注意共享内存没有进程同步与互斥 6. System V 消息队列了解 消息队列提供了从一个进程向另外一个进程发送一块数据的方法。每个数据块都被认为是有一个类型接收者进程接收的数据块可以有不同的类型值。IPC 资源必须删除否则不会自动清除除非重启所以 System V IPC 资源的生命周期随内核。 7. System V 信号量了解 信号量主要用于同步和互斥。由于各进程要求共享资源而且有些资源需要互斥使用因此各进程间竞争使用这些资源进程的这种关系为进程的互斥。系统中某些资源一次只允许一个进程使用称这样的资源为临界资源或互斥资源。在进程中涉及到互斥资源的程序段叫临界区。 END
http://www.dnsts.com.cn/news/235609.html

相关文章:

  • asp.net 网站发布乱码问题网站建设开发怎么样
  • 山东城乡建设厅网站首页wordpress怎么安装好了
  • 工信部的网站备案手机网站跳转
  • 重庆大足网站制作公司有哪些网站做的很好
  • 安徽和住房建设厅网站建设一个网站的流程图
  • 怎么选择扬中网站建设wordpress企业网站模板破解
  • 网站建设制作设计seo优化湖南做科技汽车的视频网站
  • 网站设计 app开发做办公室的网站
  • 自适应网站内容区做多大合适猎头公司是什么意思
  • 做网站怎么更新静态页餐饮网站建设可行性分析
  • 企业门户网站有哪些上线了自助建站
  • 好的平面设计网站有哪些梧州网站推广费用
  • php网站开发实例教程百度云狄网站建设
  • 甘肃新站优化个人社保缴费比例
  • 医疗网站建设比较好的怎么制作微信小程序app
  • dede减肥网站模板wordpress logo制作教程
  • 河北pc端网站开发韶关做网站
  • 建立企业网站的形式有哪些做网站图片用什么格式最好
  • 网站打开风险怎么解决网站开发实训步骤
  • 茶叶网站建设目的网站模糊效果
  • 做网站的变成语言哪类最简单如何注册属于自己的网站
  • 如何做营销型手机网站优化大叔 wordpress
  • wap手机网站开发asp经验佛山app平台
  • 网站整改建设安全设备方案公司logo设计尺寸
  • 培训门户网站源码wordpress红色主题
  • 如何做网站安全扫描绍兴建设用地使用权网站
  • 常见网站安全漏洞wordpress固定链接打不开
  • wordpress相关的网站快速建设网站外链
  • 手机网站模板 html5网站登录模版 下载
  • 做网站要和企业logo如何做网站手机