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结果的情况下运行.你能解释一下这种行为吗?谢谢!
您所看到的行为是预期的。您已完成以下操作:
O_NONBLOCK,以便写入器不需要出现在 FIFO 上。这保证了open()意志立即成功。O_NONBLOCK在后续读取之前禁用。现在,您已回到相当于标准(阻塞)情况的位置,其中 FIFO 有读取器和写入器,但写入器关闭了 FIFO。此时,读者应该看到文件结尾,这就是您所看到的。