FIFO管道在select()中始终可读

Mat*_*toe 10 c select file-descriptor fifo

在C伪代码中:

while (1) {
    fifo = open("fifo", O_RDONLY | O_NONBLOCK);
    fd_set read;
    FD_SET(fifo, &read);
    select(nfds, &read, NULL, NULL, NULL);
}
Run Code Online (Sandbox Code Playgroud)

进程在触发时休眠,select()直到另一个进程写入fifo.之后它总是会找到fifo一个可读的文件描述符.

如何避免这种行为(也就是说,在fifo读过一次之后,如何让它在被另一次写入之前被发现是不可读的?)

小智 32

您将该FIFO打开为只读(O_RDONLY),只要没有写入FIFO,读取端就会收到EOF.

选择系统调用将返回EOF,对于EOF您处理的每一个都会有一个新的EOF.这是观察到的行为的原因.

为了避免这种情况,打开FIFO进行读写(O_RDWR).这可以确保您在FIFO上至少有一个写入器,因此不会有一个EOF,因此除非有人写入该FIFO,否则select将不会返回.

  • 这是防止运行无限循环EOL检测的正确答案 (2认同)