Linux系统下FIFO的阻塞机制
创建FIFO文件
1 | mkfifo 文件名 |
FIFO文件的open
对于FIFO,需要open去打开FIFO的读端或是写端的描述符。
如果open的时候没有指定O_NONBLOCK标志,且open的是读端时
如果不存在此FIFO的已经打开的写端时,open会一直阻塞到有FIFO的写端打开;
如果已经存在此FIFO的打开的写端时,open会直接成功返回。如果open的时候没有指定O_NONBLOCK标志,且open的是写端时
如果不存在此FIFO的已经打开的读端时,open会一直阻塞到有FIFO的读端打开;
如果已经存在此FIFO的打开的读端时,open会直接成功返回。
从FIFO或者空管道读写
read时,读端fd没有指定O_NONBLOCK标志
如果存在此FIFO或管道的已经打开的写端时,阻塞到FIFO或管道中有数据或者FIFO或管道的已经打开的写端全部被关闭为止。
如果不存在此FIFO或管道的已经打开的写端时,read返回0; (!!!!!非阻塞,而是循环read)注:正因为此原因,所以曾经有一次因为read端采用长连接未关闭,但write端写完即关闭(短连接),造成了read端程序循环read(非阻塞)CPU过载的问题。最终解决方案:读写两端均采用长连接。
write时, 同read差不多,就不详述了。