4.1:概述
管道是最初的Unix IPC形式,可追溯到1973年的Unix第三版。尽管对于许多操作来说很有用,但它们的根本局限在于没有名字,从而只能由亲缘关系的进程使用。这一点随FIFO的加入得改正。
本章讲述管道和FIFO的创建与使用。我们使用一个简单的文件服务器例子,同时查看一些客户-服务器程序设计问题:IPC通道需要量、迭代服务器与并发服务器、字节流与消息接口。
4.2:一个简单的客户-服务器例子
下图所示的客户-服务器例子在本章和第六章中都要用,我们用它来分析说明管道、FIFO和System V消息队列。
图中客户从标准输入(stdin)读进一个路径名,并把它写入IPC通道。服务器从该IPC通道读出这个路径名,并尝试打开其文件来读。如果服务器能打开该文件,它就读出其中的内容,并写入IPC通道,以作为对客户的相应;否则,它就响应以一个出错消息。
4.3:管道
所有的Unix都提供管道,它由pipe函数创建,提供一个单向数据流。
#include <unistd.h> int pipe(int fd[2]); // 返回:若成功则为0,若出错则为-1
该函数返回两个文件描述符:fd[0]和fd[1],前者打开来读,后者打开来写。
管道的典型用途是以下述方式为两个不同进程(一个是父进程,一个是子进程)提供进程间的通信手段。首先由一个进程(它将成为父进程)创建一个管道后调用fork派生一个自身的副本,接着,父进程关闭这个管道的读出端(fd[0]),子进程关闭同一管道的写入端(fd[1]),这样就在父子进程间提供了一个单向数据流。如果要实现双向的数据流,则需要使用两个管道。
4.4:全双工管道
用两个半双工管道来实现。
4.5:popen和pclose
4.6:FIFO
FIFO即有名管道。
4.7:管道和FIFO的额外属性
4.8:单个服务器,多个客户
4.9:对比迭代服务器和并发服务器
4.10:字节流和消息
4.11:管道和FIFO限制
4.12:小结
时间: 2024-10-14 12:13:44