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

游戏网站建设与策划方案网站seo优化报告

游戏网站建设与策划方案,网站seo优化报告,dedecms小说采集,网站功能建设中上篇文章:Linux操作系统4-进程间通信4(共享内存原理,创建,查看,命令)-CSDN博客 本篇Gitee仓库:myLerningCode/l24 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重…

上篇文章:Linux操作系统4-进程间通信4(共享内存原理,创建,查看,命令)-CSDN博客

本篇Gitee仓库:myLerningCode/l24 · 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com)

本篇重点:进程关联与去关联共享内存,实现两个进程通信

一. 进程关联共享内存

        两个进程想要通过共享内存进行通信,在创建共享内存之后还需要将这个共享内存与我们的进程相关联。

 进程关联共享内存的系统调用如下:

//头文件
#include <sys/types.h>
#include <sys/shm.h>//函数原型
void* shmat(int shmid, const void* shmarr, int shmflg)//参数
shimid 想要关联共享内存的id
shmarr 想要关联共享内存的地址空间,一般设置为NULL
shmflg 一般设置为0//返回值
返回共享内存通过页表映射到进程地址空间的起始地址

二. 进程去关联共享内存 

        在我们使用完了这段共享内存后,如果想要让其他进程进行通信。可以让当前的进程与共享内存去关联

系统调用如下:

//头文件
#include <sys/types.h>
#include <sys/shm.h>int shmdt(const void* shmaddr);shmaddr 我们关联共享内存时候获取的地址返回值:成功返回0,失败返回-1

三. 删除共享内存 

        在上篇文章中,我们使用命令 ipcs -m 查看共享内存。使用命令 ipcrm -m 删除共享内存

我们也可以通过系统调用来删除共享内存

系统调用如下:

#include <sys/ipc.h>
#include <sys/shm.h>//用于对共享内存的控制(包含删除)
int shmctl(int shmid, int cmd, struct shmid_ds *buf)cmd:传入的二进制标志位
IPC_RMID:立即移除对应的共享内存buf:删除的话直接设置为NULL即可返回值,失败返回-1,错误码被设置

四. 实现通信 

4.1 common.hpp

        这个头文件用于实现创建,关联,去关联,删除共享内存的代码。之后只需要让server.cpp和client.cpp去调用代码即可。

创建共享内存:对于client和server来说,需要由不同的操作,server需要创建共享内存,并且存在共享内存需要出错返回,而client只需要获取共享内存的id即可

代码如下:

#include <iostream>#include <cassert>
#include <cstring>
#include <cstdlib>#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <error.h>
#include <unistd.h>// 当前的绝对路径用于获取key
#define PATHNAME "."
#define PROJ_ID 2025221
#define MAXSIZE 5// 获取key值
key_t getKey()
{// 获取一个keykey_t key = ftok(PATHNAME, PROJ_ID);assert(key != -1);
}// 传入key,创建共享内存,并返回其id
// flag是为了区分不同的进程,创建共享内存的进程需要出错返回,而另一个进程则不需要
int getShmHelp(const key_t key, int flag)
{int sid = shmget(key, MAXSIZE, flag);assert(sid >= 0);
}// 共享内存存在,需要出错返回,并且提供权限
int creatShm(key_t key)
{return getShmHelp(key, IPC_CREAT | IPC_EXCL | 0666);
}// 存在共享内存,不做任何事,只是返回id
int getShm(key_t key)
{return getShmHelp(key, IPC_CREAT);
}

关联共享内存:传入id,关联共享内存,返回地址空间的起始地址即可

// 关联共享内存与进程
void *attachShm(int shmid)
{void *mem = shmat(shmid, nullptr, 0);if ((long long)mem == -1l) // 指针占8字节{std::cerr << "attachShm error" << errno << ":" << strerror(errno) << std::endl;exit(1);}return mem;
}

去关联共享内存:传入id,去关联即可

// 去关联共享内存
void detachShm(void *start)
{int n = shmdt(start);if (n == -1){std::cerr << "detachShm error" << errno << ":" << strerror(errno) << std::endl;exit(2);}
}

 删除共享内存:传入id,删除即可

// 删除共享内存
void deleteShm(int shmid)
{int n = shmctl(shmid, IPC_RMID, nullptr);if (n == -1){std::cerr << "deleteShm error" << errno << ":" << strerror(errno) << std::endl;exit(3);}
}

4.2 server.cpp

        共享内存通信让进程地址空间与共享内存通过页表进行了映射,所以我们只需要直接向字符串一样输出信息即可。

server端接收来自client端发送的消息

代码如下:

#include "common.hpp"
#include <iostream>
#include <string>int main()
{// 1.创建共享内存int shmid = creatShm(getKey());std::cout << "server 创建共享内存成功" << std::endl;// 2.关联共享内存和进程地址空间的映射char *start = (char *)attachShm(shmid);std::cout << "server 关联共享内存成功" << std::endl;sleep(5);// 开始通信while (true){// 服务端接收信息,由于有地址空间的映射。// 我们只需要和字符串一样接收即可std::cout << start << std::endl;sleep(1);}// 3.去关联共享内存与进程地址空间的映射detachShm(start);std::cout << "server 去关联共享内存成功" << std::endl;// 4.强制删除共享内存deleteShm(shmid);std::cout << "server 删除共享内存成功" << std::endl;return 0;
}

4.3 client.cpp 

client端无需删除共享内存

#include "common.hpp"
#include <iostream>int main()
{// 获取共享内存idint shmid = getShm(getKey());std::cout << "client 获取共享内存id成功" << " sid为" << shmid << std::endl;// 关联共享内存char *start = (char *)attachShm(shmid);std::cout << "client 关联共享内存成功" << std::endl;// 开始通信const char *message = "你好server,我是client ...";int cnt = 0;while (true){snprintf(start, MAXSZIE, "%s[client pid:%d][消息编号:%d]", start, getpid(), cnt++);sleep(1);}// 去关联共享内存detachShm(start);std::cout << "client 去关联共享内存成功" << std::endl;// client无需删除共享内存,server删除return 0;
}

五. 分析测试结果

        运行测试结果如下:

先运行server,在运行ckient。可以看到server端成功接收来自client的消息

 我们让client关闭

 关闭client端之后,server端仍然打印最后一条65编号的信息。

这说明共享内存没有同步和互斥功能,如果想要实现这个功能需要我们加锁

六. 共享内存的特定与优缺点

        6.1 优点

共享内存的优点就是

是所有进程间通信中最快的,只要我们一方写入数据,另外一方可以直接看到,大大减少数据的拷贝次数

 因为共享内存不需要缓冲区,所以速度快。这里我们对比共享内存与管道通信

管道通信:

共享内存通信

 

        在不考虑键盘输入,显示器输出的情况下。

管道文件至少需要拷贝数据4次,而共享内存只需要拷贝数据两次。

很明显。共享内存大大减少的数据的拷贝次数 

6.2 缺点 

        在上面的测试中我们知道,共享内存的缺点是:不支持同步和互斥功能,如果读取速度较快,会读取到已经读取了的数据


文章转载自:

http://LZMdsonc.tkgjL.cn
http://Ecaej3rn.tkgjL.cn
http://Y8QR0T0a.tkgjL.cn
http://aWRrSKto.tkgjL.cn
http://opxrj3Hv.tkgjL.cn
http://yAEKkfaq.tkgjL.cn
http://9svaUqzl.tkgjL.cn
http://UEeADy2E.tkgjL.cn
http://0Kny1Qdk.tkgjL.cn
http://j3LyBMD0.tkgjL.cn
http://RfFUWcU5.tkgjL.cn
http://0ToFHi9e.tkgjL.cn
http://Y6DEQqox.tkgjL.cn
http://H4AS7vb3.tkgjL.cn
http://jUrCRoEY.tkgjL.cn
http://lic3rA6Q.tkgjL.cn
http://h8GTqPvP.tkgjL.cn
http://7MY7ZuAi.tkgjL.cn
http://klOHp6OW.tkgjL.cn
http://f6KYd9Ax.tkgjL.cn
http://rQcsennB.tkgjL.cn
http://dCebxapk.tkgjL.cn
http://WpeUbOJ2.tkgjL.cn
http://lbvgPZ0R.tkgjL.cn
http://OGyvUmCP.tkgjL.cn
http://E9gjNQx7.tkgjL.cn
http://IaMt9kz9.tkgjL.cn
http://HV8fAbv7.tkgjL.cn
http://PVfjAAve.tkgjL.cn
http://5VcvH2wr.tkgjL.cn
http://www.dtcms.com/wzjs/697282.html

相关文章:

  • 莱芜网站优化排名公司中文网站欣赏
  • 如何建立自己的网站商城长沙学校网站建设
  • 免费网站建设报价网站类型定义
  • 环保网站设计价格黑龙江省建设厅网站首页
  • 上饶市建设局网站个人网站如何获得流量
  • 大型网站制作导图工业设计外包平台
  • 门户网站的优缺点杭州seo公司
  • 成都哪家做网站最好开发一个网站平台多少钱
  • 购物网站源代码浙江网站建设外贸
  • 大良网站建设如何徐州模板开发建站
  • 免费素材网站素材库东营网站备案代理公司
  • 吉安市建设规划局网站电子商务网站设计书
  • 佛山网站代运营准度科技有限公司湘潭建设网站公司
  • 零基础建设网站视频教程公司网站建设价位
  • 昌都网站建设四川招投标网
  • 自媒体网站源码root.txt文件放到您网站的根目录下
  • 南宁做网站开发的公司有哪些服装设计网站有哪些
  • 澄海网站建设杭州专业程序开发公司
  • 网站设计哪家强合肥网站建设哪里有
  • 做微信表情的微信官方网站网站建设内容规划表
  • 网站备案 地域appui设计图
  • 离石做网站的公司国外网站 设计
  • 南宁网站建设liluokj延安网站设计公司
  • 艺术培训学校系统网站怎么做舒路视觉的展馆设计案例
  • 深圳国内网站建设哪种技术做网站容易论文答辩
  • 做查询网站 发布数据华艺网站建设
  • 佛山外贸网站建站网站迭代
  • 网站外包合作wordpress产品页面静态化
  • 国内炫酷的网站设计企业系统化管理的优势
  • 有网站模板怎么建站邯郸房产网签查询网