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

企业网站建设顾问b2b免费发布信息网站

企业网站建设顾问,b2b免费发布信息网站,如何做网站相册,wordpress设置ssl网站打不开一、管道介绍 管道(Pipe)是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入,从而实现数据的流动。管道是一种轻量级的通信方式,用于协调不同进程的工作。 1. 创建和使用管道&#…

一、管道介绍 

        管道(Pipe)是一种在UNIX和类UNIX系统中用于进程间通信的机制。它允许一个进程的输出直接成为另一个进程的输入,从而实现数据的流动。管道是一种轻量级的通信方式,用于协调不同进程的工作。

      1. 创建和使用管道:

  • 创建: 管道可以通过在Shell命令中使用竖线符号 | 来创建,也可以在程序中使用系统调用 pipe 来创建。
  • 使用: 管道通过将一个进程的标准输出(stdout)连接到另一个进程的标准输入(stdin),从而实现两者之间的数据传输。
  • 2. 匿名管道:
  • 类型: 管道分为匿名管道(Anonymous Pipe)和命名管道(Named Pipe)。
  • 匿名管道: 由操作系统动态创建,用于具有亲缘关系的进程之间的通信,其句柄仅在创建时有效。
  • 3. 命名管道(FIFO):
  • 类型: 命名管道是一种特殊的文件,也称为FIFO(First In, First Out)。
  • 命名: 在文件系统中具有唯一名称,不限于亲缘关系的进程,可以在不同进程之间共享数据。
  • 4. 进程间通信(IPC):
  • 目的: 管道用于实现进程间通信,允许一个进程的输出成为另一个进程的输入。
  • 特点: 管道是半双工的,数据流只能单向传输,需要两个管道来实现双向通信。
  • 5. Shell中的管道:
  • 语法: 在Shell中,使用 | 将一个命令的输出传递给另一个命令,形成管道。
  • 示例: ls | grep "pattern",这会将 ls 的输出传递给 grep 进行过滤。
  • 6. 程序中的管道:
  • 系统调用: 在C语言等编程语言中,可以使用 pipe 系统调用创建管道,使用 dup2 复制文件描述符,最后使用 exec 执行其他程序。
  • 7.关闭和错误处理:
  • 关闭: 使用管道时,需要确保在合适的时候关闭不需要的文件描述符,以避免资源泄漏。
  • 错误处理: 对于管道的创建和使用,需要进行错误处理,以处理可能发生的异常情况。
  • 8.限制和注意事项:
  • 有限性: 管道的缓冲区有限,可能导致阻塞,特别是在没有足够空间来容纳数据时。
  • 同步问题: 管道的使用可能涉及到进程间的同步问题,需要谨慎处理。
图1  匿名管道
ls |wc -l

        这是一种典型的使用匿名管道的情况,用于连接两个进程,其中一个进程的输出成为另一个进程的输入。在这里,ls命令用于列出目录中的文件,而wc -l命令则用于统计行数,因此可以用于统计目录中文件的数量。

 二 、管道特点

 

匿名管道工作

  1. 内核内存中的缓冲器:

    • 管道是在内核内存中维护的缓冲器,用于在两个进程之间传递数据。这个缓冲器是有限的,因此管道的容量是有限的,当管道达到容量上限时,写操作可能会阻塞。
  2. 匿名管道与有名管道的特性:

    • 匿名管道没有文件实体,它是通过系统调用 pipe 创建的。有名管道则是在文件系统中有唯一名称的文件,通过 mkfifo 创建。有名管道可用于不同进程之间的通信,而匿名管道通常用于有亲缘关系的进程。
  3. 管道的读写操作:

    • 管道的读写操作与文件相似,可以使用标准的文件I/O操作,如readwrite。进程通过向管道写入数据,或从管道读取数据来进行通信。
  4. 消息边界的缺失:

    • 与消息队列不同,管道是一个字节流,不存在消息边界的概念。进程可以读取任意大小的数据块,而不受写入数据块大小的限制。这种特性使得管道在流式数据传输场景中非常灵活。
  5. 数据的顺序性:

    • 管道传递的数据是顺序的,即数据的读取顺序与写入顺序保持一致。这确保了在管道中传递的数据在接收端是按照正确的顺序被处理。
  6. 单向传递:

    • 管道是单向的,即数据的传递方向是确定的。一端用于写入数据,另一端用于读取数据。这使得管道成为半双工的通信机制。
  7. 一次性读取:

    • 从管道中读取数据是一次性的操作,即一旦数据被读取,它就从管道中被移除。这也意味着,如果某个进程没有读取所有写入管道的数据,这些数据将被丢弃。
  8. 无法随机访问:

    • 与文件不同,管道中的数据不能通过 seek() 等操作进行随机访问。由于管道是一个流式的通信机制,数据只能按顺序读取。
  9. 匿名管道的限制:

    • 匿名管道通常限制在具有公共祖先的进程之间使用。这通常是父子进程之间的通信,或者通过其他方式具有亲缘关系的进程之间的通信。匿名管道是在 pipe() 系统调用时创建的。

三、 为什么可以使用管道进行进程间通信

 

        在父子进程或兄弟进程之间使用匿名管道进行通信时,理解文件描述符表的概念是非常重要的。文件描述符表是每个进程内部维护的一张表,用于跟踪打开的文件和其他I/O资源。以下是匿名管道在进程间通信中与文件描述符表的关系:

  1. 文件描述符的创建:

    • 当调用 pipe 系统调用创建匿名管道时,会返回两个文件描述符,这两个文件描述符分别代表管道的读端和写端。
  2. 父子进程之间的文件描述符继承:

    • 在调用 fork 创建子进程时,子进程将会继承父进程的文件描述符表。这意味着子进程也会获得父进程的管道文件描述符。
  3. 关闭不需要的文件描述符:

    • 通常,在使用管道进行通信时,需要关闭不需要的文件描述符。例如,在子进程中关闭管道的写端,在父进程中关闭管道的读端,以确保每个进程只使用它需要的文件描述符。
  4. 数据流动:

    • 当一个进程向管道写入数据时,数据通过管道流向另一个进程。这是通过在一个进程中使用 write,在另一个进程中使用 read 来完成的,而这些操作使用文件描述符。
匿名管道通信(父子进程、兄弟进程)

四、管道的数据结构

 

五、 父子进程之间使用匿名管道通信


/*#include <unistd.h>int pipe(int pipefd[2]);功能:创建一个匿名管道,用来进程通信参数:int pipefd[2] 这个数组是一个传出参数pipefd[0] 对应管道的读端(文件描述符)pipefd[2] 对应管道的写端返回值:成功:0失败:-1注意: 匿名管道只能用于具有关系的进程之间的通信(父子进程、兄弟进程)*/#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
// 子进程发送数据给父进程,父进程输出
int main(){// 在fork之前创建管道int pipefd[2];int ret = pipe(pipefd);if(ret==-1){perror("pipe");exit(0);}// 创建子进程pid_t pid =fork();if(pid>0){printf(" i am a parent,pid : %d\n",getpid());char buf[1024]={0};while(1){//读int len = read(pipefd[0],buf,sizeof(buf));printf("parent recv :%s,pid: %d\n",buf,getpid());char * str ="heloo ,i am your parent";// 想管道写数据write(pipefd[1],str, strlen(str));sleep(1);}}else if(pid==0){//sleep(10);printf(" i am a child process, pid: %d\n",getpid());char buf[1024]={0};while (1){char * str ="heloo ,i am your grandfaher";// 向管道写数据write(pipefd[1],str, strlen(str));sleep(1);// 读int len = read(pipefd[0],buf,sizeof(buf));printf("parent recv :%s,pid: %d\n",buf,getpid());}}return 0;
}

 六、fpathconf查看管道大小

  fpathconf 是一个用于获取文件路径配置值(pathconf values)的函数。通过这个函数,可以获取与文件或文件描述符相关联的一些运行时配置信息,包括管道的大小。

       要查看管道的大小,可以通过 fpathconf 函数来获取相应的配置值。对于管道的大小,我们关注的是 PIPE_BUF,它表示一个原子的写入或读取操作的最大字节数。注意,PIPE_BUF 并不一定反映实际管道的大小,而是表示每次写入或读取的最大字节数,它是一个限制,不同系统可能有不同的值

 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>int main(){int pipefd[2];int ret = pipe(pipefd);//获取管道大小long size = fpathconf(pipefd[0],_PC_PIPE_BUF);printf("pipe size : %ld\n",size);return 0;
}

http://www.hkea.cn/news/92047/

相关文章:

  • 日韩系成人影片成首选网站如何优化推广
  • 网站到期续费通知搜索风云排行榜
  • 网站公司说我们做的网站服务器不够用哪个杭州seo好
  • 类似淘宝网站建设费用杭州哪家seo公司好
  • 装修网站怎样做seo专员很难吗
  • 无锡网站外包如何接广告赚钱
  • 英文网站制作 官网淘宝标题优化网站
  • 电力建设网站网络推广网站的方法
  • 如何做网站窗口网站优化网络推广seo
  • 营销型网站建设效果网络营销策划推广方案
  • 专业的网站搭建多少钱网站seo优化价格
  • 广州公司网站设计制作win10优化大师官网
  • 做调查哪个网站比较可靠百度指数查询
  • 怎么在建设厅网站报名广州网站优化服务
  • 怎么用dw做静态网站b站好看的纪录片免费
  • 济南网站建设那家好网站制作公司有哪些
  • 域名和网站名不一样营销公司
  • discuz做电影网站免费网站seo
  • 惠民建设局网站明年2024年有疫情吗
  • 卫龙的网站是谁做的今日的新闻
  • 厚街找人做网站动态网站设计
  • 永春县住房和城乡规划建设局网站太原seo排名优化软件
  • 怎么上网站后台爱站小工具计算器
  • 网页编辑岗位职责seo上海优化
  • 网站做二维码吗做网站的外包公司
  • 郑州市中原区疫情最新消息上海网站营销seo方案
  • 狂人站群系统中国最权威的网站排名
  • 简单网站开发实例网站运营工作的基本内容
  • 飞机免费代理ip爱站网seo综合查询工具
  • 河南焦作有做网站开发的公司吗巩义网络推广公司