1.管道的特点1.一个管道是一个字节流当讲到管道是一个字节流时,意味着在使用管道时是不存在消息或者消息边界的概念的。从管道中可以读取任意大小的数据块,通过管道传递的数据是顺序的,在管道中无法使用 lseek() 来随机访问数据.2.从管道中读取数据当试图从一个当前为空的管道中读取数据将会被阻塞直到至少有一个字节被写入到管道中为止。3.管道是单向的在管道中的数据传递方向是单向的。4.可以确保写入不超过 PIPE_BUF 字节的操作是原子的如果多个进程写入同一个管道,那么如果它们在一个时刻写入的数据量不超过 PIPE_BUF 字节,那么就可以确保写入的数据不会发生互相混合的情况。当写入管道的数据块大小超过了 PIPE_BUF 字节,那么内核可能会将数据分割成几个较小的数据块来传输,在读者从管道中消耗数据时再附加上后续的数据。当只有一个进程向管道写入数据时,PIPE_BUF 的取值就没有关系了。但如果有多个进程写入,那么大数据块的写入可能被分割成任意大小的段,并可能出现于其他进程的写入的数据混合的情况。5.管道的容量是有限的其实管道是一个在内核维护的缓冲器。这个缓冲器的能力是有限的。一旦管道被填满之后,后续向该管道的写入操作就会被阻塞直到读者从管道中移除一些数据为止。使用较大的缓冲器的原因是效率:每当写着充满管道时,内核必须执行一个上下文切换以允许读者被调度来消耗管道中的一些数据。使用较大的缓冲器意味着需要执行的上下文切换次数更少。2.创建和使用管道1.管道允许相关进程间的通信管道允许任意2个或者多个相关进程之间的通信,只要在创建子进程的系列 fork() 调用之前通过一个共同的祖先进程创建管道即可。2.关闭未使用的管道描述符1.关闭未使用管道文件描述符不仅仅是为了确保进程不会消耗其文件描述符的限制。2.从管道中读取数据的进程会关闭其持有的管道的写入描述符,这样当其他进程完成输出并关闭其写入描述符之后,读者就能够看到文件结束。如果读取进程没有关闭管道的写入端,那么在其他进程关闭了写描述符之后,读者也不会看到文件结束,即使它读完了管道中的所有数据。相反,read()将会阻塞以等待数据,这是因为内核知道至少还有一个管道的写入描述符打开着,即读取进程自己打开的这个描述符。3.写入进程关闭其持有的管道的读描述符是出于不同的原因。当一个进程试图向一个管道中写入数据但没有任何进程拥有该管道的打开着的读取描述符时,内核会向该写入进程发送一个 SIGPIPE 信号。在默认情况下,这个信号会杀死一个进程。但进程可以捕获或者忽略这个信号,这样就会导致一个 write()操作因为 EPIPE 错误而失败。收到 SIGPIPE 信号或者得到 EPIPE 错误对于提示管道的状态是有用的,这就是为何需要关闭管道的未使用读取描述符的原因。如果写入进程没有关闭管道的读取端,那么即使在其他进程已经关闭了管道的读取端之后写入进程仍然能够向管道写入数据,最后写入进程会将数据充满整个管道,后续的写入请求会被永远阻塞。4.关闭未使用描述符的最后一个原因是只有当所有进程中所引用一个管道的文件描述符被关闭之后才会销毁该管道以及释放该管道占用的资源以供其他进程复用。此时,管道中所有未读取的数据都会丢失。3.将管道作为进程同步的一个方法4.使用管道作为连接过滤器5.通过管道与 shell 命令进行通信: popen()popen() 创建了一个管道,然后创建了一个子进程来执行 shell,而 shell 又创建了一个子进程来执行 command 字符串。pclose() IO 结束之后,可以调用 pclose()函数关闭管道并等待子进程中的 shell 终止(不应该使用 fclose() 函数,因为它不会等待子进程)。pclose()在成功时会返回子进程中的 shell 的终止状态(即 shell 所执行的最后一条命令的终止状态,除非 shell 是被信号所杀)。与 system() 一样,如果无法执行 shell, 那么pclose()会返回一个值就像是子进程中的 shell 通过 _exit(127)来终止一样。如果发生了其他错误,那么返回 -1.popen()更加方便一些,它会构建管道,执行描述符复制,关闭未使用的描述符并帮助开发人员处理 fork()和 exec() 的所有细节。此外,shell 处理针对的是命令。这种便捷牺牲的是效率。因为至少需要创建2个额外的进程:一种用于 shell,一个或多个用于 shell 执行的命令。与 system() 一样,在特权进程中永远都不应该使用 popen().6.管道和 stdio 缓冲由于 popen()调用返回的文件流指针没有引用一个终端,因此 stdio 库会对这种文件流应用块缓冲。可以使用一个伪终端来替换管道。一个伪终端是一个 IPC 通道,对进程来说它就像一个终端。其结果是 stdio 库会逐行输出缓冲器中的数据。7.FIFO从语义上来说,FIFO与管道类似,它们两之间最大的差别在于 FIFO 在文件系统中拥有一个名称,并且其打开方式与打开一个普通文件是一样的。这样就能够将 FIFO 用于非相关进程之间的通信。FIFO 有时也被称为 命名管道。mkfifo使用 FIFO 和 tee(1) 创建双重管道线:shell 管道线的其中一个特征是它们是线性的,管道线中的每个进程都读取前一个进程产生的数据并将数据发送到其后的一个进程中。使用 FIFO 就能够在管道线中创建子进程,这样除了将一个进程的输出发送给管道线中的后面一个进程之外,还可以复制进程的输出并将数据发送到另外一个进程。要完成这个任务需要使用 tee 命令,它将其从标准输入中读取到的数据复制2份并输出:一份写到标准输出,另外一份通过命令参数指定的文件中。pipe();
pipe2();
popen();
pclose();
mkfifo();
mknod();

44.Linux/Unix 系统编程手册(下) -- 管道和 FIFO相关推荐

  1. linux/unix系统编程手册11-15

    title: linux/unix编程手册-11_15 date: 2018-05-27 11:53:07 categories: programming tags: tips linux/unix编 ...

  2. Linux/Unix系统编程手册 第三章:系统编程概念

    本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...

  3. Linux/UNIX系统编程手册gg

    Linux系统: "所见皆文件" 一个比较好的博客 一.Linux基础操作 Linux系统目录: bin:存放二进制可执行文件 boot:存放开机启动程序 dev:存放设备文件: ...

  4. Linux/Unix系统编程 五:进程

    进程是一个可执行程序的实例. 一.linux系统进程管理 1.进程管理的作用 判断机器健康状态 查看系统中所有进程 杀手进程 2.查看系统进程 1.ps -aux BSD操作系统格式: TTY说明: ...

  5. Linux系统编程手册-源码的使用

    Linux系统编程手册-源码的使用 转自:http://www.cnblogs.com/pluse/p/6296992.html 第三章后续部分重点介绍了后面章节所要使用的头文件及其实现,主要如下: ...

  6. Linux/Unix系统下nginx+php安装简明教程

    本文转载自Linux/Unix系统下nginx+php安装简明教程,请保留转载信息~ 一.安装nginx: 1. 安装pcre库,nginx的rewrite模板需用到pcre库: mkdir -p / ...

  7. 在Linux/Unix系统下用iconv命令处理文本文件中文乱码问题

    iconv命令是运行于linux/unix平台的文件编码装换工具.当我们在linux/unix系统shell查看文本文件时,常常会发现文件的中文是乱码的,这是由于文本文件的编码与当前操作系统设置的编码 ...

  8. 5w字总结 Unix系统编程学习笔记(面试向)(Unix环境高级编程/Unix环境程序设计)

    文章目录 一.计算 C语言的数据表示与处理 计算 C语言的基本运算操作 内存表和符号表 类型转换 函数类型的分析 指令 复合指令 句法 函数 函数激活(Activation Record) 函数激活定 ...

  9. ①Linux简明系统编程(嵌入式公众号的课)---总课时12h

    10.09 注意:这个是Linux高级编程的简明教程,是Linux应用程序的开发,而不是底层程序的开发. 内容是关于操作系统和网络编程的吗? Linux简明系统编程 〇.课程思维导图 〇.会用到的头文 ...

  10. 【Linux】系统编程之文件(标准I/O库)

    目录 一.文件I/O与标准I/O的区别(open与fopen) 1.来源 2.移植性 3.适用范围 4.文件IO层次 5.缓冲 二.函数fopen.fwrite.fread.fseek.fclose ...

最新文章

  1. Lyft估值目标近200亿美元 有望成今年来美国最大IPO
  2. WSL(windows subsystem for linux)安装错误:安装过程中遇到错误,但可以继续安装。组件: ‘WSL 内核‘ 错误代码: 0x80072f78解决方法
  3. DataGridView中的rows.Count比实际行数多1的原因以及解决办法
  4. python实现二分查找算法_python实现二分查找算法
  5. TS 188字节流结构图
  6. 爬虫-通过正则表达式爬取学校选课网站的课程
  7. Linux 镜像文件下载
  8. 智能优化算法——布谷鸟搜索算法原理(附代码)
  9. 适合做个人博客网站的一套静态页面模板,非常不错哦
  10. AndroidStudio常用字体
  11. 15种方法活力一整天
  12. Matlab 蒙特卡洛求解三门问题
  13. thinkphp 批量打包下载图片到本地电脑
  14. 简单个人网页设计作业 静态HTML个人博客主页——HTML+CSS+JavaScript 明星鹿晗(7页)
  15. 案例:世界500强如何打造汽车后市场智慧门店
  16. Leetcode 算法面试冲刺 热题 HOT 100 刷题(406 416 437 438 448)(六十九)
  17. navigationController的一些用法
  18. 自考《操作系统概论》
  19. 民族企业家周景川:凡事勤则易,凡事惰则难
  20. 投资即修行,千里之行始于足下

热门文章

  1. 【Espruino】NO.06 关键是你的仆人(继续)
  2. 关于handler的再次讨论
  3. silverlight 中缓存应用程序相应的库文件
  4. [Cocos2d-x] init()和onEnter()方法的区别
  5. SonarQube 7.7默认数据库连接方法
  6. Aspose.Cells基础使用方法整理
  7. Linux Vi 的使用
  8. 130242014034(2)-“电商系统某功能模块”需求分析与设计实验课小结
  9. 团队作业:《构建之法》团队学习心得
  10. 过滤器为JSP文件生成静态页面