之前说明了进程控制原语,但是这些进程之间交换信息的唯一途径就是传送打开的文件,可以由fork或exec传送,也可以通过文件系统来传送,接下来说明进程之间相互通信的其他技术-进程间通信(IPC)
管道:
管道是unix中IPC最古老的形式,管道有以下几点局限:
1.历史上是半双工的
2.管道只能在具有共同父辈的两个进程间使用。
尽管有这些局限性,半双工管道仍是最常见的IPC形式,每当在管道中键入一个命令序列,让shell执行时,shell都会为每一条命令单独创建一个进程,然后用管道将前一条命令进程的标准输出与后条命令的标准输入相连接。
管道是通过调用pipe函数创建的。
#include <unistd.h>
int pipe(int fd[2]);
经由参数fd返回两个文件描述符:fd[0]为读而打开,fd[1]为写而打开,fd[1]的输出是fd[0]的输入。
下图给出了两周过描述半双工管道的方法。左图显示管道的两端在一个进程相互连接,右图则强调数据需要通过内核在管道中流动。
单个进程中的管道几乎没有任何作用,通常进程会先调用pipe,接着调用fork,从而创建父进程到子进程的IPC通道。下图显示了这种情况
对于从父进程到子进程的管道,父进程关闭管道的读端(fd[0]),子进程关闭写端(fd[1])。对于子进程到父进程的管道,父进程关闭fd[1],子进程关闭fd[0]。
当管道的一端被关闭后,下列两条规则起作用:
1.当读(read)一个写端被关闭的管道时,在所有数据都被读取后,read返回0,表示文件结束。
2.如果写(write)一个读端已经被关闭的管道,则产生信号SIGPIPE。