无法在linux中使用fcntl切换到阻塞模式
发布时间:2020-12-14 02:14:03 所属栏目:Linux 来源:网络整理
导读:我有一个示例程序: 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,
我有一个示例程序:
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; } 似乎在从文件描述符中删除非阻塞标志之后,读取调用应该阻塞,直到将某些内容写入FIFO,但我的程序始终运行而没有阻塞且rd = 0结果.你能解释一下这种行为吗?谢谢! 解决方法
您所看到的行为是预期的.你做了以下事情:
>使用O_NONBLOCK打开FIFO的读取端,因此FIFO上不需要写入器.这保证了open()会立即成功.>在后续读取之前禁用O_NONBLOCK.您现在已经回到了一个与标准(阻塞)情况相同的位置,其中FIFO具有读写器,但编写器关闭了FIFO.此时,读者应该看到文件结束,这就是您所看到的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |