加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

无法在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.此时,读者应该看到文件结束,这就是您所看到的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读