在C伪代码中:
while (1) {
fifo = open("fifo", O_RDONLY | O_NONBLOCK);
fd_set read;
FD_SET(fifo, &read);
select(nfds, &read, NULL, NULL, NULL);
}
进程按
select()
触发的方式休眠,直到另一个进程写入fifo
为止。之后,它将始终找到fifo
作为可读的文件描述符。如何避免这种行为(也就是说,在
fifo
被读取一次之后,如何使它被发现为不可读,直到它得到另一次写入?) 最佳答案
您以只读方式打开了该fifo(o\u rdonly),当fifo没有写入程序时,读取端将收到EOF
。
select system call will return onEOF
,对于您处理的每个EOF
,都会有一个新的EOF
。这就是观察到的行为的原因。
为了避免这种情况,读写都要打开fifo(o_rdwr)。这样可以确保fifo上至少有一个写入程序,因此不会有EOF
并且因此,除非有人写入fifo,否则select不会返回。
关于c - FIFO管道在select()中始终可读,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14594508/