不正确使用FIFO的程序会出现细微的问题。如果我们没有任何进程打开FIFO进行写入,则打开FIFO进行读取的进程将阻塞。如果父子进程都打开同一个FIFO进行读操作,但是没有其他进程打开文件进行写操作,那么父子进程都会阻塞。这种现象称为死锁(deadlock),所以打开一个文件和打开一个FIFO还是有区别的。内核为管道和FIFO维护一个访问计数器,其值是访问同一管道或FIFO的打开描述符的数量。有了访问计数器,客户端或服务器可以成功调用unlink,尽管该函数从文件系统中删除了指定的路径名??,但之前打开的描述符不受影响。然而,对于其他形式的IPC,例如SystemV消息队列,这样的计数器是不存在的。因此,如果服务器在将其最终消息写入消息队列后删除队列,则当客户端尝试读取最终消息时,队列可能已经消失。使用shell命令echo将数据写入管道test.pip,使用另一个进程读取管道(cat)中的数据。这两个命令之间的间隔可以是任意时间长度。从表面上看,这可能会让我们认为即使没有进程打开FIFO,数据也会以某种方式保存在FIFO中。事实上,情况并非如此。真正的规则是:当最终关闭管道或FIFO时,管道中的所有剩余数据都将被丢弃。当回显数据到达test.pip时,FIFO的open调用将被阻塞,直到我们在未来某个时刻执行cat命令。mkfifotest.pip#CreateaFIFOecho'123'>test.pipthesecondshellecho'456'>test.pipthethirdshellecho'789'>test.pip这些shell会阻塞直到下面的shellcattest.pip#输出是如下:789456123#然后取消上面三个shell块,进入正常输入模式。因此,管道或FIFO不能保存数据。要想写,就得有读的过程。要想读书,写作一定有一个过程。否则会阻塞,直到取消阻塞后再读写。虽然打开和关闭管道进行读写的功能和普通文件一样,但是结果不一致。例如,如果您打开一个文件进行写入,然后关闭该文件,则该文件的内容将被清除。如果是管道或者FIFO,写打开的进程会阻塞,直到有进程要读。这时,这些被阻塞的open调用就会进入正常模式,依次向FIFO写入数据,先进先出,由读进程取出。当然,以上是管道的默认行为。您可以通过设置非阻塞标志来影响管道或FIFO的行为。当前操作流水线或FIFO的现有打开操作被阻塞(默认)。成功同上FIFO未打开用于写入Block直到FIFO被打开用于写入返回成功openFIFOwriteonlyFIFO被打开用于读取返回成功返回成功同上FIFO未被打开用于读取Block直到FIFO被打开用于读取返回ENXIOerrorfromemptypipeoremptyFIFOread管道或FIFO打开写入并阻塞,直到管道或FIFO中有数据或管道或FIFO不再打开写入。返回EAGAIN错误同上。管道或FIFO未打开写入。readreturns0(endoffile)readreturns0(fileTerminator)tothepipeorFIFOwritePipeorFIFOisopenedtoread(generallynormal,somerules)(一般正常,有些规则)同上pipeorFIFO不是打开读取到线程生成SIGPIPE到线程生成SIGPIPE
