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

wordpress主题恢复/青岛seo网站排名

wordpress主题恢复,青岛seo网站排名,手机网站建设怎么样,如何购买网站空间一、什么是管道 1.1 unix中最古老的进程间通信 1.2 一个进程链接到另一个进程的数据流称为“管道”: 图解: 二、管道通信的原理 2.1当我们创建一个进程然后打开一个文件的时候 会经过以下步骤: ①首先要描述这个进程,为这个…

一、什么是管道

1.1 unix中最古老的进程间通信
1.2 一个进程链接到另一个进程的数据流称为“管道”:

图解:

二、管道通信的原理

2.1当我们创建一个进程然后打开一个文件的时候

会经过以下步骤:

①首先要描述这个进程,为这个进程创建一个task_struct的结构体对象;

②然后通过task_struct结构体里的文件描述符表指针找到这张文件描述符表;

③通过文件描述符表里的指针指向所对应打开的文件;

④文件里包含有inode文件属性、file_operators读写方法、缓冲区;

这时候就可以调用文件的读写方法对这个文件进行操作了!

图解:

2.2 当我们创建一个子进程的时候

此时子进程就能够看到父进程所看到的所有文件!!

进程通信的本质:让不同的进程看到统一份资源!

既然子进程能够看到父进程的内容了,那么父子进程之间怎么进行通信呢??

2.3 约定

想进行通讯父子进程间必须要有一个约定,要么规定父进程写入,子进程读取;或者父进程读取,子进程写入;

然而这样就行了吗?还没有,因为如果父进程是以读的方式打开的文件,子进程继承后也只能以读的方式操作这个文件而不能实现父写子读、父读子写,那怎么办呢?

2.4 方法

①父进程打开文件的时候以读文件打开一次文件,再以写方式打开一次文件(共打开两次同一文件);

②父进程fork子进程后,子进程继承父,并根据实际的场景,关闭父的读+子的写(实现父写子读)或者关闭父的写+子的读(实现父读子写)!

图解:

三、代码实现

3.1 用到的接口

①:建立管道接口

#include <unistd.h>  //头文件
int pipe(int pipefd[2]); //返回值小于0表示失败,pipefd 输出型参数,意思传入一个数组把文件的文件描述符带出来让用户使用!!

记住:pipefd[0] :读下标   pipefd[1] :写下标

②:系统调用写接口

#include<unistd.h> //头文件
ssize_t write(int fd,void*buffer,size_t count);
//fd -> 写入一个被打开的文件的描述符
//buffer -> 作为缓冲区用来写入/读取文件
// count -> 写入的大小
//size_t 写入成功返回写入的字节数,写入失败返回-1

③:系统调用读接口

#include <unistd.h> //头文件
ssize_t read(int fd,void*buffer,size_t count);
//fd ->  被打开的文件的描述符(从哪读)
// buffer -> 读写缓冲区 (读到哪)
// count -> 读取的字节数
// ssize_t -> 读取成功返回读取的字节数,读取失败返回-1,读取到文件末尾返回0

④:fork()函数

#include <unistd.h> //头文件
#include <sys/types.h> //头文件
函数原型pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#includesys/types.h>中)返回值:若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1

⑤:snprintf()函数

#include <stdio.h>//头文件
int snprintf(char* str,size_t size,const char*format,...);
//str -> 写到的位置
// size -> 写到的位置的大小
// format -> 格式字符串
// ... 列表
⑥:waitpid()函数
#include <sys/types.h> 
#include <sys/wait.h>
pid_t waitpid(pid_t pid,int *status,int options);
3.2 linux下实现两个进程之间的管道通信
//testipc1.cpp
#include <unistd.h>
#include <cstdio>
#include <cstring>
#include <sys/wait.h>
#include <sys/types.h>
#include <iostream>
#define SIZE 1024
using namespace std;
void Write(int wfd)
{//写入内容char buffer[SIZE]={0};//缓冲区int number =0;//记录写入次数const char*message="hello linux!! i am child!!";while (true){//子不停写snprintf(buffer,sizeof(buffer),"%s - pid:%d -%d\n",message,getpid(),number++);write(wfd,buffer,strlen(buffer));sleep(2);//每隔两秒写}}
void Read(int rfd)
{char buffer[SIZE]={0};//缓冲区while(true){ssize_t redcount= read(rfd,buffer,sizeof(buffer));if(redcount){buffer[redcount]='\0';}cout<<buffer<<endl;}
}
int main()
{int pipefd[2];int retpipe=pipe(pipefd);//建立管道pid_t id=fork();//创建子进程if(id<0)return 1;//创建失败else if(id==0){//child//父读子写,子关闭读close(pipefd[0]);Write(pipefd[1]);exit(0);//子写完退出程序}else//farther//父读子写,父关闭写close(pipefd[1]);Read(pipefd[0]);pid_t retpid=(id,NULL,0);if(retpid<0)return 3;//等待失败return 0;
}
//makefile文件
testipc1:testipc1.cpp ##依赖目标:依赖文件g++ -o $@ $^ -std=c++11     
.PHONY:clean
clean:rm -f testipc1

测试:

父进程成功读取子进程写入的内容!!

四、总结

4.1、管道的五大特征

①具有血缘关系的进程;

②父子进程会协同,同步与互斥,---保护管道文件的数据安全;

③管道只能单向通信;

④管道是面向字节流的;

⑤管道是基于文件的,而文件的生命周期是随进程的;

4.2、管道的几种情况

①读写端正常,管道如果为空,读端阻塞;

②读写正常,管道写满,写端阻塞;

③读端正常,写端关闭,读端会读到0;

http://www.whsansanxincailiao.cn/news/30337806.html

相关文章:

  • WordPress开网站很慢/站长之家收录查询
  • 国内谷歌网站SEO优化/发软文是什么意思
  • 专门做中文音译歌曲的网站/seo视频教学网站
  • 谷歌网站推广报价/html网页制作
  • android开发/四川seo哪里有
  • 怎么做网站发布/优化大师app下载安装
  • 做网站月入过万/抖音关键词挖掘工具
  • 河北云建站/软文推广公司有哪些
  • 大连做网站绍兴厂商/seo查询 站长工具
  • 盐城建设公司网站/搜索引擎优化的基础是什么
  • 苏州小程序/班级优化大师使用指南
  • 网站建设课程设计报告/买外链网站
  • 智慧树网页设计与制作作业答案/seo sem是什么职位
  • 金融投资网站方案/如何网络推广新产品
  • 玫琳凯网站建设与推广方案/网站编辑seo
  • 网站制作北京海淀/优化品牌seo关键词
  • 链家准备做贝壳网站/搜索引擎优化的名词解释
  • 做视频网站要什么格式好/营销型网站建设易网拓
  • 周口seo 网站/做个公司网站大概多少钱
  • 移动版网站怎么做/网络推广的含义
  • 网站域名劫持/建站教程
  • 贵州省城市建设厅网站/关键词工具软件
  • 青海建设厅通报网站/网站优化策略分析
  • 用git 做网站/搜索关键词然后排名怎样提升
  • 网站项目策划方案/无锡百度快速优化排名
  • 龙岩建网站/网站快速优化排名排名
  • 网站建设的开多少税率/浙江关键词优化
  • 网站空间多大合适/信息流推广的竞价机制是
  • 动态网站建设/友链交换平台
  • 如何设计网页模板/seo排名工具给您好的建议