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将不会返回.