7.1 管道
在进程之间通信的最简单的方法是通过一个文件,其中有一个进程写文件,而另一个进程从文件中读,这种方法比较简单,其优点体现在:
·只要进程对该文件具有访问权限,那么,两个进程间就可以进行通信。
·进程之间传递的数据量可以非常大。
尽管如此,使用文件进行进程间通信也有两大缺点:
·空间的浪费。写进程只有确保把新数据加到文件的尾部,才能使读进程读到数据,对长时间存在
的进程来说,这就可能使文件变得非常大。
·时间的浪费。如果读进程读数据比写进程写数据快,那么,就可能出现读进程不断地读文件尾部,
使读进程做很多无用功。
要克服以上缺点而又使进程间的通信相对简单,管道是一种较好的选择。
所谓管道,是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称pipe文件。向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接受管道输出的接收进程(即读进程),可从管道中接收数据。由于发送进程和接收进程是利用管道进行通信的,故又称管道通信。这种方式首创于Unix系统,因它能传送大量的数据,且很有效,故很多操作系统都引入了这种通信方式,Linux也不例外。
为了协调双方的通信,管道通信机制必须提供以下三方面的协调能力:
·互斥。当一个进程正在对pipe进行读/写操作时,另一个进程必须等待。
·同步。当写(输入)进程把一定数量(如4KB)数据写入pipe后,便去睡眠等待,直到读(输出)进程取走数据后,再把它唤醒。当读进程读到一空pipe时,也应睡眠等待,直至写进程将数据写入管道后,才将它唤醒。
·对方是否存在。只有确定对方已存在时,方能进行通信。