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

做网站编辑前景谷歌浏览器在线入口

做网站编辑前景,谷歌浏览器在线入口,网站中的搜索功能怎么做的,增加收录网站目录 1.理解层面1.1为什么要进程间通信??1.2什么是通信??1.3怎么通信??1.4 具体通信的方式?? 2.管道3.匿名管道3.1 用fork来共享管道3.2 特性3.3 通信情况 4.命名管道4.1 创建一个命…

目录

  • 1.理解层面
    • 1.1为什么要进程间通信??
    • 1.2什么是通信??
    • 1.3怎么通信??
    • 1.4 具体通信的方式??
  • 2.管道
  • 3.匿名管道
    • 3.1 用fork来共享管道
    • 3.2 特性
    • 3.3 通信情况
  • 4.命名管道
    • 4.1 创建一个命名管道
    • 4.2 匿名管道和命名管道的区别
  • 5.System V 共享内存
    • 5.1 共享内存函数

1.理解层面

1.1为什么要进程间通信??

  • 数据传输:一个进程需要将它的数据发送给另一个进程
  • 资源共享:多个进程之间共享同样的资源
  • 通知事件:一个进程需要向另一个或一组进程发送消息,通知它发生了某种事情(如进程终止时要通知父进程)
  • 进程控制:有些进程希望完全控制另一个进程的执行(Debug进程)

1.2什么是通信??

进程间通信是指在计算机系统中,运行在不同进程之间的数据交换和通信机制。由于每个进程都有自己的独立内存空间,因此进程间通信需要通过特定的机制来实现数据的共享和传递

1.3怎么通信??

进程间通信的本质:是先让不同的进程,先看到同一份资源[“内存”]

1.4 具体通信的方式??

  • 基于文件的,管道通信
    • 匿名管道pipe
    • 命名管道
  • System V ,本机通信
    • System V 消息队列
    • System V 共享内存
    • System V 信号量

2.管道

什么是管道??

  • 管道是Unix中最古老的进程间通信的形式
  • 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”
    在这里插入图片描述

3.匿名管道

#include<unistd.h>
int pipe(int pipefd[2]);
参数:pipefd:文件描述符数组,其中pipefd[0]表示读端,pipefd[1]表示写端返回值:成功返回0,失败返回-1
//列子:查看pipefd对应的文件描述符
//testPipe.cc#include <iostream>
#include <unistd.h>int main()
{//1.创建管道int pipefd[2]={0};//pipefd[0] 读端  pipefd[1] 写端int n=pipe(pipefd);if(n<0){perror("pipe fail");exit(1);}std::cout<<"pipefd[0]: "<<pipefd[0]<<std::endl;std::cout<<"pipefd[1]: "<<pipefd[1]<<std::endl;
}//运行结果:
$ ./testPipe
pipefd[0]: 3
pipefd[1]: 4

3.1 用fork来共享管道

在这里插入图片描述

//测试样例:测试管道的读写
//让父进程读,子进程写
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include <cstring>void ChildWrite(int wfd)
{char buff[1024];int cnt=0;while(true){snprintf(buff,sizeof(buff),"I am child,my pid:%d,cnt: %d\n",getpid(),cnt++);write(wfd,buff,strlen(buff));sleep(1);}
}
void FatherRead(int rfd)
{char buff[1024];while(true){buff[0]=0;ssize_t n=read(rfd,buff,sizeof(buff)-1);if(n>0){buff[n]=0;std::cout<<"father say: "<<buff<<std::endl;}sleep(1);}
}int main()
{// 1.创建管道int pipefd[2] = {0}; // pipefd[0] 读端  pipefd[1] 写端int n = pipe(pipefd);if (n < 0){perror("pipe fail");exit(1);}std::cout << "pipefd[0]: " << pipefd[0] << std::endl;std::cout << "pipefd[1]: " << pipefd[1] << std::endl;// 2.创建子进程pid_t id =fork();if(id<0){perror("fork fail");exit(1);}else if(id==0){//child//3.关闭不需要的读端,形成通信close(pipefd[0]);ChildWrite(pipefd[1]);close(pipefd[1]);exit(0);}else{//father//3.关闭不需要的写端,形成通信close(pipefd[1]);FatherRead(pipefd[0]);close(pipefd[0]);}
}//查看运行结果:
$ ./testPipe
pipefd[0]: 3
pipefd[1]: 4
father say: I am child,my pid:1670938,cnt: 0father say: I am child,my pid:1670938,cnt: 1father say: I am child,my pid:1670938,cnt: 2father say: I am child,my pid:1670938,cnt: 3father say: I am child,my pid:1670938,cnt: 4father say: I am child,my pid:1670938,cnt: 5
...

3.2 特性

  • 匿名管道,只能用来进行具有血缘关系的进程进行进程间通信(常用于父子)
  • 管道文件,自带同步机制
  • 管道是单向通信的
  • (管道)文件的生命周期,是随进程的
  • 管道是面向字节流的,意味着数据以字节为单位字管道中传输

3.3 通信情况

  • 写慢,读快 —读端就要阻塞(进程)

  • 写快,读慢 —满了的时候,写就要阻塞等待
    在这里插入图片描述

  • 写关,继续读 —read就会读到返回值为0,表示文件结尾

  • 读关闭,写继续 —写端在写入没有任何意义,OS会杀掉写端进程,发送异常信号

4.命名管道

  • 让2个不相关的进程之间交换数据,可以使用FIFO文件来做这个工作,它叫做命名管道
  • 命名管道是一种特殊类型的文件

4.1 创建一个命名管道

# 从命令行上创建
$ mkfifo filename#从程序里创建
int mkfifo(const char *pathname, mode_t mode);

4.2 匿名管道和命名管道的区别

  • 匿名管道由pipe函数创建并打开
  • 命名管道由mkfifo函数创建,open打开
  • 匿名管道只能在具有血缘关系的进程里进行进程间通信
  • 命名管道可以用来进行不相关的进程的进程间通信

5.System V 共享内存

  • 共享内存是进程间通信中,速度最快的方式(优点):
    • 映射之后,读写,直接被对方看到
    • 不需要进行系统调用获取或者写入
  • 共享内存没有保护机制(缺点):
    • 通信双方,没有所谓的“同步机制”
    • 数据不一致
      在这里插入图片描述

5.1 共享内存函数

  • shmget函数
功能:用来创建共享内存
原型:int shmget(key_t key, size_t size, int shmflg);
参数:key:这个共享内存段名字size:共享内存大小shmflg:权限标志取值IPC_CREAT:共享内存不存在,创建并返回;共享内存已存在,获取并返回取值IPC_CREAT|IPC_EXCL:共享内存不存在,创建并返回;共享内存已存在,出错返回
返回值:成功返回一个非负整数,即共享内存标识码;失败返回-1
  • shmat函数
功能:将共享内存段连接到进程地址空间
原型:void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:shmid:共享内存标识shmaddr:虚拟地址,固定地址进行挂接shmflg:它的2个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回起始的虚拟地址;失败返回-1
  • 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;失败返回-1
命令(cmd)说明
IPC_STAT把shmid_ds结构中的数据设置为共享内存的当前关联值
IPC_SET在进程有足够权限的前提下,把共享内存的当前关联值设置成shmid_ds数据结构中给出的值
IPC_RMID删除共享内存段
http://www.dtcms.com/wzjs/32421.html

相关文章:

  • 购物网站建设案例百度网站的网址是什么
  • 网站目录爬行成都搜索优化整站优化
  • 房山手机网站建设域名批量查询注册
  • 最新消息疫情数据正规网站优化推广
  • 青海手机网站建设什么是seo营销
  • 泗阳城乡建设局网站网站排名首页
  • 做网站标题图片大小长沙seo外包服务
  • wp网站打开太慢怎么做优化产品软文怎么写
  • o2o商城分销网站开发企业seo排名哪家好
  • 云南建设人力资源网站游戏优化大师
  • 福建省建设招投标网站百度风云榜
  • 网站建设收费价目表重庆白云seo整站优化
  • 网站的模块怎么做专业的seo外包公司
  • 学校建设网站的目的和意义百度极速版客服人工在线咨询
  • 网站备案 办理幕布拍照公司建官网要多少钱
  • 房产信息网预告是什么意思优化网站
  • 经营性网站放宽备案条件seo平台是什么
  • 视频网站开发背景地推推广方案
  • 常州手机网站建设优化百度seo
  • 全国政府网站建设情况免费单页网站在线制作
  • b2c网站好处网络营销方法有哪些
  • 网站制作策划建设大纲品牌seo培训咨询
  • 网站建设 空间竞价推广哪家公司好
  • 招商加盟网站模板htmlseo工作职位
  • 哪些网站可以做迁徙图莆田百度快照优化
  • 山东城市建设学院网站最近三天的新闻大事小学生
  • 网站建设销售是什么酒店seo是什么意思
  • 做网站的字体免费crm系统手机版
  • 网站建设有哪些常用行为淘宝指数转换工具
  • 网站优化 推广网站运营推广的方法有哪些