当前位置:嗨网首页>书籍在线阅读

12-总结

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

44.11 总结

管道是UNIX系统上出现的第一种IPC方法,shell以及其他应用程序经常会使用管道。管道是一个单项、容量有限的字节流,它可以用于相关进程之间的通信。尽管写入管道的数据块的大小可以是任意的,但只有那些写入的数据量不超过PIPE_BUF字节的写入操作才被确保是原子的。除了是一种IPC方法之外,管道还可以用于进程同步。

在使用管道时必须要小心地关闭未使用的描述符以确保读取进程能够检测到文件结束和写入进程能够收到SIGPIPE信号或EPIPE错误。(通常,最简单的做法是让向管道写入数据的应用程序忽略SIGPIPE并通过EPIPE错误检测管道是否“坏了”。)

popen()和pclose()函数允许一个程序向一个标准shell命令传输数据或从中读取数据,而无需处理创建管道、执行shell以及关闭未使用的文件描述符的细节。

FIFO除了mkfifo()创建和在文件系统中存在一个名称以及可以被拥有合适的权限的任意进程打开之外,其运作方式与管道完全一样。在默认情况下,为读取数据而打开一个FIFO会被阻塞直到另一个进程为写入数据而打开了该FIFO,反之亦然。

本章讨论了几个相关的主题。首先介绍了如何复制文件描述符使得一个过滤器的标准输入或输出可以被绑定到一个管道上。在介绍使用FIFO构建一个客户端-服务器的例子中介绍了几个与客户端-服务器设计相关的主题,包括为服务器使用一个众所周知的地址以及迭代式服务器设计和并发服务器设计之间的对比。在开发示例FIFO应用程序时提到尽管通过管道传输的数据是一个字节流,但有时候将数据打包成消息对于通信来讲也是有用的,并且介绍了几种将数据打包成消息的方法。

最后介绍了在打开一个FIFO并执行I/O时O_NONBLOCK标记(非阻塞I/O)的影响。O_NONBLOCK标记对于在打开FIFO时不希望阻塞来讲是有用的,同时对读取操作在没有数据可用时不阻塞或在写入操作在管道或FIFO没有足够的空间时不阻塞也是有用的。

更多信息

[Bach, 1986]和[Bovet & Cesati, 2005]讨论了管道的实现。有关管道和FIFO的有用细节还可以在[Vahalia, 1996]中找到。