无法在 linux 中使用 fcntl 切换到阻塞模式

标签 c linux io nonblocking fcntl

我有一个示例程序:

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 结果。你能解释一下这种行为吗?谢谢!

最佳答案

您看到的行为是预期的。您已完成以下操作:

  1. 使用 O_NONBLOCK 打开 FIFO 的读取端,这样 FIFO 上就不需要写入程序了。这保证了 open() 将立即成功。
  2. 在后续读取之前禁用 O_NONBLOCK。您现在已经回到与标准(阻塞)情况相同的位置,其中 FIFO 具有读取器和写入器,但写入器关闭了 FIFO。那时,读者应该看到文件结尾,这就是您所看到的。

关于无法在 linux 中使用 fcntl 切换到阻塞模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29587305/

相关文章:

C 预处理器将 "int x"拆分为 int & x

Python:处理模块

linux - bash - 排除 "for file in $(find ...)"中的目录

Linux命令cp产生省略的目录

c++ - 无法读取二进制文件

java - 输入流/读取器是否总是意味着关闭?

c - 访问 libnetlink.h

c - 如何返回指向缓冲区中位置的指针?

c - isdigit 类似适用于 float 的函数

ruby - 为什么 ruby​​ 的单个操作系统线程在复制文件时不会阻塞?