①,创建一个名叫exam.fifo的命名管道,等②③中输入cat命令后,再在①通过echo往管道中输入数据
②,在管道中没有数据的时候,处于阻塞挂起状态,等管道中有数据的时候,立马显示,
③,在管道中没有数据的时候,处于阻塞挂起状态,等管道中有数据的时候,立马显示,
我在做测试的时候,②中cat命令要早于③的,从结果上看,
实际只能一个进程得到管道的数据,而且与命令的启动时间没有太大关系
②和③各有一次得到了管道中的数据
在linux进程间通信(IPC)可以通过信号量、文件系统、消息队列、共享内存还有管道来实现的。
其中消息队列、内存管理是在System V中提出的。
进程通信间涉及到了管道,而且管道在shell命令中也大有用处。那就简要说说管道:
管道顾名思义,你可以将其理解为日常生活中的管子,一边流入,一边流出。它可以有半双工和全双工。
半双工就是只能一边流入,另一边流出;全双工则是一边可以流入,也可以流出。
pipe就是一种半双工的管道。形如: ls | grep .*START
其中,fd[1] 用来向管道中写入数据,而fd[0]在另一端用来读出数据。
如果现有两个进程要利用pipe进行通信。此时,就要保证只能有一个写入端和一个读出端,即:fd[1]和fd[0]只能有一个。
不属于任何文件系统,只存在于内存中,它是无名无形的,
fifo是一种全双工,即:它的一端既可以进行读取fd[0],也可以进行写入fd[1]。
有名有形的,LINUX中设立了一个专门的特殊文件系统--管道文件,它存在于文件系统中,
任何进程可以在任何时候通过有名管道的路径和文件名来访问管道。
但是在磁盘上的只是一个节点,而文件的数据则只存在于内存缓冲页面中,与普通管道一样。
正因为它的这种通信方式,使其可以用来涉及基于C/S模式的网络通信。具体做法:
首先让服务器产生一个服务器端的FIFO,然后让各个客户端产生以其PID为名称的客户端的FIFO,
在客户于服务器进行通信时,客户端向服务器端发送自己的PID,以使服务器对客户的请求进行响应时,向其客户端的FIFO写入响应信息。
代码实现客户端和服务器进行各自的名称和PID交换。
FIFO相对PIPE有一个优势,
就是FIFO只要求两个进程是同一主机的,而不要求进程之间存在亲缘关系。
FIFO是存在于文件系统的文件,可以使用诸如open、read、write等函数来操作。
FIFO是一种进程通信机制,它突破通常管道无法进行无关进程之间的通信的限制,使得同一主机内的所有的进程都可以通信。
FIFO又叫命令管道,是一个文件类型。