我有一个示例程序:
int main()
{
const char* fn = "/tmp/tmpfifo";
int i = mkfifo(fn, 0666);
int fd = open(fn, O_RDONLY | O_NONBLOCK);
int flags = fcntl(fd, F_GETFL);
flags &= ~O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
char buf[1024];
int rd= read(fd, buf, 100);
cout << rd << endl;
remove(fn);
return 0;
}
似乎从文件描述符中删除非阻塞标志后,read
调用应该阻塞,直到有内容写入 FIFO,但我的程序总是在没有阻塞和 rd 的情况下运行=0
结果。你能解释一下这种行为吗?谢谢!
最佳答案
您看到的行为是预期的。您已完成以下操作:
- 使用
O_NONBLOCK
打开 FIFO 的读取端,这样 FIFO 上就不需要写入程序了。这保证了open()
将立即成功。 - 在后续读取之前禁用
O_NONBLOCK
。您现在已经回到与标准(阻塞)情况相同的位置,其中 FIFO 具有读取器和写入器,但写入器关闭了 FIFO。那时,读者应该看到文件结尾,这就是您所看到的。
关于无法在 linux 中使用 fcntl 切换到阻塞模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29587305/