Linux系统下FIFO的阻塞机制

Linux系统下FIFO的阻塞机制

创建FIFO文件

1
mkfifo 文件名

FIFO文件的open

对于FIFO,需要open去打开FIFO的读端或是写端的描述符。

  1. 如果open的时候没有指定O_NONBLOCK标志,且open的是读端时
    如果不存在此FIFO的已经打开的写端时,open会一直阻塞到有FIFO的写端打开;
    如果已经存在此FIFO的打开的写端时,open会直接成功返回。

  2. 如果open的时候没有指定O_NONBLOCK标志,且open的是写端时
    如果不存在此FIFO的已经打开的读端时,open会一直阻塞到有FIFO的读端打开;
    如果已经存在此FIFO的打开的读端时,open会直接成功返回。

从FIFO或者空管道读写

  1. read时,读端fd没有指定O_NONBLOCK标志
    如果存在此FIFO或管道的已经打开的写端时,阻塞到FIFO或管道中有数据或者FIFO或管道的已经打开的写端全部被关闭为止。
    如果不存在此FIFO或管道的已经打开的写端时,read返回0; (!!!!!非阻塞,而是循环read)

    :正因为此原因,所以曾经有一次因为read端采用长连接未关闭,但write端写完即关闭(短连接),造成了read端程序循环read(非阻塞)CPU过载的问题。最终解决方案:读写两端均采用长连接。

  2. write时, 同read差不多,就不详述了。

-------------本文结束感谢您的阅读-------------
0%