Linux 网络编程-进程管道

目录

4.1 管道

4.3.1 用 C 来建立、使用管道

4.3.2 需要注意的问题

4.2 有名管道

4.4.1 有名管道的创建

4.4.2 有名管道的 I/O 使用

4.4.3 未提到的关于有名管道的一些注意



4.1 管道


简单的说,管道就是将一个程序的输出和另外一个程序的输入连接起来的单向通道。它是 UNIX/Linux 系统的各种进程通信方法中,最古老而应用最为广泛的一种(特别是在 shell 中)。
#ls -l|more
在上面的例子中我们建立了这样的一个管道:获取 ls -l 的输出,再将其作为 more 命令的输入。形象的说,就是数据沿着管道从管道的左边流到了管道的右边。
这个例子并不复杂,只要是对 Linux/UNIX 比较熟悉的人都曾经使用过类似的命令。但是,在简单的命令底下,Linux/UNIX 内核究竟都做了些什么呢?
当进程创建一个管道的时候,系统内核同时为该进程设立了一对文件句柄(一个流), 一个用来从该管道获取数据(read),另一个则用来做向管道的输出(write)。
图 4-1 显示了进程和管道间的相互作用。
从图 4-1 中可以清楚的看出进程和管道是如何通过句柄进行数据交换的。进程通过句柄 fd[0]向管道写入(write)数据,同时通过 fd[1]从管道读出(read)数据。到这里有人也许会想起 UNIX 的文件处理。事实上,在 Linux 系统内核里,每个管道都是用一个 inode 节点来表示的。(当然,你是不会看到这个节点的,它只存在于系统的内核中。)理解了这一点,我们就可以容易的掌握接下来要讲的管道的 I/O 处理了。
不过,到目前为止,我们所建立的管道模型还没有任何的实际意义。因为这个管道只被用来同单个进程通信。建立一个同自己通信的管道有什么用处呢?为了解决这个问题,我们在主进程中利用 fork()函数创建一个自身的自进程。大家也许还记得,fork()的子进程自动继承了父进程打开的文件句柄。利用继承的句柄,就可以实现父/子间的通信了。这个关系可以用图 4-2 来表示:
 

Linux 网络编程-进程管道_第1张图片



图 4-1 进程和管道间的相互作用

 

Linux 网络编程-进程管道_第2张图片




图 4-2 fork()函数调用后的管道


现在,父子两个进程同时拥有对同一个管道的读写句柄。因为管道必须是单向的(因为它没有提供锁定的保护机制),所以我们必须决定数据的流动方向(从父到子,还是从子到父?),然后在每个进程中关闭不需要的句柄。假设我们需要管道从子进程向父进程传送数据,关闭了相应句柄后的管道可以用图 4-3 来表示。
 

Linux 网络编程-进程管道_第3张图片



图 4-3 关闭了相应句柄后的管道

这样,一个完整的管道就被建立了。下面我们就可以使用 read()和 write()函数来对它进行读写操作了。关于这两个函数的具体使用在 UNIX 的文件函数中有介绍,读者可以

你可能感兴趣的:(Linux网络编程,linux,网络,unix)