pipe/fifo 管道与有名管道

时间:2021-02-23 15:08:34
pipe/fifo
1. 管道用于有血缘关系的进程之间的通信。
2. fifo可用于任意进程之间的通信,fifo在系统的文件系统内有一个名字。虽然FIFO在文件系统中有一个路经名,但对FIFO的IO操作不会涉及到底层的设备。
3. pipe与fifo的不同仅仅在于打开和创建的方式上,在其它的方面两者没有区别。因此下面的描述对两者都适用。
4. 如果一个进程试图读一个空管道,read 函数将会阻塞直到数据到来。如果一个进程写一个full管道,write函数将会阻塞直到有足够多的数据从管道读出,从而使得write操作能够完成。(第4条都是没有设置O_NONBLOCK的条件下的情形)
5. 管道提供的是字节流通信,没有任何消息边界的概念。
6. 如果一个管道的所有写端都已经关闭,则读管道将会得到一个文件结束符(read将支返回0).如果一个管道的所有读端都已经关闭,则写管道将会收到一个 SIGPIPE 信号。
7. 管道没有lseek操作
8. 管道容量: 一个管道的容量是有限的。POSIX规定少于 PIPE_BUF 的写操作必须原子完成:要写的数据应被连续的写到管道。大于 PIPE_BUF 的写操作可能是非原子的: 内核可能会把此数据与其它进程的对此管道的写操作交替起来。POSIX规定PIPE_BUF至少为512B(linux中为4096B)  具体的语义如下: 其中n为要写的字节数.
    * n <= PIPE_BUF, O_NONBLOCK无效:原子的写入n个字节。如果管道当前的剩余空间不足以立即写入n个字节,就阻塞直到有足够的空间。
    * n <= PIPE_BUF, O_NONBLOCK有效:如果有足够的空间写入n个字节,write立即成功返回。否则write失败,并设置errno为EAGAIN  (此时没有写入字节).
    * n >  PIPE_BUF, O_NONBLOCK无效:非原子写。可能会和其它的写进程交替写。write阻塞直到将n个字节写入管道。
    * n >  PIPE_BUF, O_NONBLOCK有效:如果管道满,write失败,并将errno设置为 EAGIN。
如果管道不满,依次写入这n个字节(可能会出现"部分写",调用者应该检查write的返回值来判断实际写入了多少字节),可能会和其它的进程交替写。
9. 对管道来说,只有两个状态标志有有意义的: O_NONBLOCK  O_ASYNC
    O_ASYNC: 如果对管道的读端描述符设置了此标志,当有新的数据写入管道的时候,会产生信号(默认是SIGIO)