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

hov*_*ovo 5 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;
}
Run Code Online (Sandbox Code Playgroud)

似乎在从文件描述符中删除非阻塞标志之后,read调用应该阻塞,直到将某些内容写入FIFO,但我的程序总是在没有阻塞和rd=0结果的情况下运行.你能解释一下这种行为吗?谢谢!

mtk*_*mtk 3

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

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