在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/

10-13 02:03