我有一个示例程序:
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上存在写入器。这样可以保证open()
会立即成功。O_NONBLOCK
在后续读取之前禁用。现在,您已回到相当于FIFO具有读取器和写入器,但写入器关闭FIFO的标准(阻塞)情况的位置。那时,读者应该看到文件结尾,这就是您所看到的。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句