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

网站开发工程师大学网站备案证书如何打开

网站开发工程师大学,网站备案证书如何打开,谷城县城乡建设局网站,湖南湘潭网站建设Linux 1、引言2、实现共享内存2.1、创建一个共享内存2.2、将共享内存链接到进程空间2.3、断开与共享内存的链接2.4、对共享内存进行后续操作 3、应用实例 1、引言 在之前一篇文章Linux学习笔记之六#xff08;进程之间的管道通信和信号处理#xff09;中我讲了进程间可以通过… Linux 1、引言2、实现共享内存2.1、创建一个共享内存2.2、将共享内存链接到进程空间2.3、断开与共享内存的链接2.4、对共享内存进行后续操作 3、应用实例 1、引言 在之前一篇文章Linux学习笔记之六进程之间的管道通信和信号处理中我讲了进程间可以通过管道通信。管道通信也是在内存中某个地方开辟一块内存让不同进程可以访问它进而实现通信的目的。 而本文所讲的共享内存也大概是这么一个逻辑不过相较与管道通信内存共享实现起来更加复杂也没有读写阻塞功能但执行起来的效率也更加高似乎是最快的进程通信方式。 2、实现共享内存 共享内存其任务在于从物理内存中申请一块内存区域然后将这个区域映射到不同进程的空间中。进而进程访问该共享区域进行读写操作。下图截取于B站该图比较清晰明了说明了共享内存的运行逻辑。从这张图可以看出任何进程都有自己的空间而这些空间本质是取之于物理内存但取的顺序则是杂乱的。共享内存无非是一块大家都可以取走的内存块而已。 接下来说明实现共享内存的基本步骤 第一步创建一个共享内存 第二步将共享内存链接到进程空间 第三步断开与共享内存的链接 第四步对共享内存进行后续操作如销毁 2.1、创建一个共享内存 创建一个共享内存用到的函数是shmget(share memory get)其函数原型如下 int shmget(key_t key, size_t size, int shmflag);参数概览 key设置该共享内容的关键字标识。 size指定共享内存的空间大小。 shmflag设置共享内存的访问权限。 返回值创建成功则返回共享内存标识符失败则返回-1. 参数详解 1. key参数key 参数是一个用于标识共享内存段的关键字。它允许多个进程通过使用相同的 key 参数来访问同一个共享内存段。这就是说如果多个进程想要访问同一个共享内存段它们必须提供相同的 key 参数值。 通常情况下key 参数可以是一个由 ftok() 函数生成的键值通过给定文件路径名和一个项目标识符来生成唯一的键值也可以是手动指定的一个键值也可以通过一些宏指定一些key值。 关于ftok函数其函数原型如下 key_t ftok(const char *pathname, int proj_id);第一个参数是真实存在的文件路径第二个参数是项目的id可以自己设定。 计算机会根据这两个参数的组合生成一个独一无二的key值保证不同进程可以访问同一个内存空间。 2. size参数一般而言我们会设置成4096的整数倍因为计算机的最小内存单元就是4kB但如果不设置成4096的整数倍也无所谓计算机会根据自动帮你调整到合适的值。比如你设置2009计算机也会帮你调整到4096. 2. shmflag参数该参数用于设置共享内存的访问权限一般由一些宏和四位整数组成比如0777 | IPC_CREAT。权限的设置相信大家都耳熟能详了第一位0表示后面的三位数字是八进制数字777分别表示用户、用户组、其他人的权限。7会被拆解位111分别表示rwx读写执行三个权限。 常见的宏有 IPC_CREAT若共享内存存在则打开否则创建一个。 IPC_EXCL若共享内存不存在则创建否则报错。 IPC_NOWAIT若该操作需要等待直接报错。 最后是调用该函数需要头文件后文提到的所有函数也需要包含这几个头文件 #include sys/types.h #include sys/ipc.h #include sys/shm.h2.2、将共享内存链接到进程空间 在这一步用到函数是shmat其函数原型如下 void *shmat(int shmid, const void *addr, int shmflg);参数概览 shmid这里输入的是共享内存的标识符其实就是shmget函数的返回值。 void *addr指定链接到进程中的哪个地址块一般不需要指定由计算机自动分配即可。 int shmflg标志位一般设置为0即可。 返回值成功则返回共享内存在进程空间中的链接地址失败则返回-1。 注void *指的是无类型指针无类型换一种理解方式就是可以赋予它任意类型。 通过这个步骤我们拿到了链接地址再用这个地址来索引相应的内存空间之后便可以进行读写操作以实现进程通信。 2.3、断开与共享内存的链接 进程通信结束之后自然是要将进程与共享内存之间的链接断开。这一步用到的函数时shmdt其函数原型如下 int shmdt(const void *address);void *address该地址指的进程空间中的链接地址。一般就是shmat中的返回值了。 返回值成功则返回0失败则返回-1。 2.4、对共享内存进行后续操作 进程通信结束链接也断开下一步自然是要考虑如何回收或销毁这个共享内存了。用到的函数时shmctl其函数原型如下 int shmctl(int shm_id, int command, struct shmid_ds *buf);shm_id共享内存对象的id即内存的标识符。一般时shmget的返回值。 command指定对该内存的操作命令主要有删除命令(IPC_RMID)。 shmid_ds *buf该参数用于获取内核结构的结构值一般也不用。故直接设置为0即可。 最后注意一点如果使用调用shmctl(shmid, IPC_RMID, 0)这句话最后删除的只是共享内存的标识符使系统不再维护该内存标识符而不是真正把共享内存释放掉。如果想要共享内存被释放掉则需要等到该内存没有被任何进程调用时系统才会自动被释放掉。 3、应用实例 本例子的目的创建两个进程A和BA进程往共享内存写入数据B进程将数据读出来。 故首先创建一个进程A去往一块共享内存写入数据。 #include stdio.h #include stdlib.h #include string.h #include sys/types.h #include sys/ipc.h #include sys/shm.hint main() {key_t key ftok($HOME/shared_memory/program_A.c, 9); //generate a unique keyint shmid shmget(key, 4096, 0751|IPC_CREAT); //create a shared memorychar *addr shmat(shmid, 0, 0); //link the shared memory with this program char buffer[100]; //create a buffer for writing datawhile(1){printf(\nPlease input a character: );fgets(buffer, sizeof(buffer), stdin);if(strcmp(buffer, q\n) 0) //judge whether what I input is q or notbreak; strncpy(addr, buffer, sizeof(buffer)); //writing data into the shared memory}if(shmdt(addr) 0){printf(disconnect shared memory successfully!\n);}else{printf(fail to disconnect!\n);}if(shmctl(shmid, IPC_RMID, 0) 0){printf(delete the identifer successfully!\n);}else{printf(the identifer already be deleted!\n);}return 0; } 其次创建一个进程B从共享内存中读取数据。 #include stdio.h #include stdlib.h #include string.h #include sys/types.h #include sys/ipc.h #include sys/shm.hint main() {key_t key ftok($HOME/shared_memory/program_A.c, 9); int shmid shmget(key, 4096, 0751|IPC_CREAT); char *addr shmat(shmid, 0, 0); while(1){char input;printf(please input a character: );scanf(%c, input);if(input q)break;int c;while ((c getchar()) ! \n c ! EOF) {}printf(what i receive is: %s\n, addr);}if(shmdt(addr) 0){printf(disconnect successfully!\n);}else{printf(fail to disconnect!\n);}if(shmctl(shmid, IPC_RMID, 0) 0){printf(delete successfully!\n);}else{printf(the identifer already be deleted!\n);}return 0; }最后我打开两个终端同时运行进程A和B运行结果如下
http://www.yutouwan.com/news/503041/

相关文章:

  • 网站建设否定关键词网页制作软件有哪些
  • dede 做手机网站网站策划与建设阶段
  • 有没有免费的crm系统软件某网站优化方案
  • 建筑中级职称查询网站浙江华企做网站
  • 网站建设服务费如何做会计分录网站建设算无形资产
  • seo怎么做网站优秀案例网络建设规划
  • 网站开发asp.net上海正规搬家公司一览表
  • 枣强网址建站凡科网站模板下载
  • vps 一个ip 多个网站 软件 linux平面设计怎么接单
  • 专门做尾单的网站门户网站免费奖励自己
  • 成都优化网站哪家公司好手机建设网站公司
  • 服务器做的网站怎么使用教程网页设计代码
  • 自己做的网站不能用手机访问石家庄网站建设推广公司报价
  • 安阳网站建设公司出租车公司网站策划书结尾
  • 网站建设 技术要求拓展公司网站建设
  • 新手学做网站图纸境外 网站网站
  • 广州网站建设与网页设计wordpress导航美化
  • 爱站网注册人查询汽车设计网站大全
  • 成都住建局官网查询关键词seo优化排名
  • 哈尔滨市营商环境建设监督局网站搜索引擎营销seo
  • 铜川市网站建设做捕鱼网站电话号码
  • 营销公司网站模板江西工厂网站建设
  • 网站镜像 动态品牌营销型网站
  • 网站主页和子页风格如何统一wordpress主题汉化教程
  • 高清做网站插图百度自动提交
  • 网站的后台怎么做的苏州网站建设白石
  • 龙华网站建设价格赣州网上房地产
  • 中型网站建设网站建设 招聘
  • 电子商务网站建设怎么做宁波seo品牌推广排名
  • 哪些网站的做的好看的建设部网站工程资质