03_管道(一.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
03_管道(一

管 道(一) 回顾 进程的结构、类型 以多种方法启动新进程 父进程、子进程、僵进程 什么是信号以及如何使用它们 本章目标 管道的定义 进程管道 管道调用 父进程和子进程 命名管道 什么是管道 管道是Unix中最古老的进程间通信的形式。 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道” 我们通常把是把一个进程的输出连接或“管接”(经过管道来连接)到另一个进程的输入。 在shell中使用管道(2-1) 链接shell命令:把一个进程的输出直接馈入另一个的输入,命令格式如下 cmd1 | cmd2 cmd1的标准输入来自终端键盘 cmd1的标准输出馈入cmd2做为它的标准输出 cmd2的标准输出连接到终端屏幕上 在shell中使用管道(2-2) 进程管道 不需要使用shell的底层函数pipe函数 需要使用shell来解释给定命令的高级函数popen和pclose.popen函数实际上调用了pipe函数。 管道特点 pipe函数 作用:通过pipe函数在两个程序之间传递数据时不需要启动一个shell来解释命令 pipe函数示例(2-1) pipe函数示例(2-2) 管道关闭后的操作 当没有数据可读时,read调用就会阻塞,即进程暂停执行,一直等到有数据来到为止。 如果管道的另一端已经被关闭,也就是没有进程打开这个管道并向它写数据时,read调用就会阻塞 popen函数 (2-1) 作用:允许一个程序把另外一个程序当作一个新的进程来启 动,并能对它发送数据或接收数据 popen函数(2-2) 每个popen调用都必须指定“r”或“w”,在popen的标准实现里不支持任何其他的选项 如果open_mode是“r”,调用者程序利用popen返回的那个“FILE*”类型的指针用一般的stdio库函数(比如fread)就可以读这个文件流 如果open_mode是“w”,调用者程序就可以使用fwrite向被调用命令发送数据 pclose函数 作用:关闭popen打开的与之关联的文件流 popen示例(2-1) popen示例(2-2) 复制文件描述符dup(2-1) dup系统调用从头开始搜文件描述符数组,并且在找到第一个空闲文件描述符时完成它的复制。 #include unistd.h int dup(int oldfd); 复制文件描述符dup (2-2) 执行dup(2)前后的效果 复制文件描述符 dup2 #include unistd.h int dup2(int oldfd, int newfd); dup2系统调用复制操作之前,如果newfd已被打开,先关闭。 复制文件描述符fcntl #include unistd.h #include fcntl.h int fcntl(int oldfd,F_DUPFD,int minifd); fcntl从指定的minifd开始搜索空闲文件描述符,找到时,复制oldfd,返回值为新的文件描述符。 另外fcntl还有其他的作用。 dup示例(3-1) dup示例(3-2) dup示例(3-3) 总结 管道的定义 进程管道 dup和dup2函数的使用 父进程和子进程 第二章 shell所做的工作从最终效果上看是这样的:重新 安排标准输入和输出流之间的连接,使数据从键 盘输入流过两个命令再输出到屏幕 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。 int pipe(int file_descriptor[2]); 参数是由两个整数类型的文件描述符组成的数组 file_descriptor[0]为读而打开,file_descriptor [1]为写而打开。file_descriptor[1]的输出是file_descriptor[0]的输入。 操作成功返回“0”,如果操作失败,返回“-1”,并设置errno指示失败的原因 通过pipe在父子进程之间传递数据 #include unistd.h #include stdio.h #include fcntl.h int main() { int fda[2]; char buf[1]; int curflag; if (pipe(fda)==-1) { printf(error\n); } switch (fork()) 通过pipe在父子进程之间传递数据 { case -1: printf(error\n); break; case 0: read(fda[0],buf,1);

文档评论(0)

yuguanyin2015 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档