read()从文件返回什么?

时间:2018-05-09 15:33:38

标签: c linux io blocking

在以下所有参考文献中:

http://pubs.opengroup.org/onlinepubs/9699919799/

https://linux.die.net/man/3/read

它说:

  

尝试读取文件(管道或FIFO除外)时   支持非阻塞读取,并且当前没有可用的数据:

     

如果设置了O_NONBLOCK,则read()将返回-1并将errno设置为   [EAGAIN]。

     

如果O_NONBLOCK清零,则read()将阻塞调用线程,直到   一些数据可用。

     

如果存在某些数据,则使用O_NONBLOCK标志无效   可用。

但谁真的尝试过呢?正如我测试的那样,以上所有情况都会让read()返回0。

无论我是这样设置的,O_NONBLOCK似乎都无法正常工作:

int flags = O_RDONLY;
int mode = S_IRGRP|S_IROTH|S_IRUSR;
int _pbfd = (::open)("123",flags,mode);

或者这样:

int _pbfd = (::open)("123",flags,mode);
int saved_flags = fcntl(_pbfd, F_GETFL);
fcntl(_pbfd, F_SETFL, saved_flags & ~O_NONBLOCK);

1 个答案:

答案 0 :(得分:1)

适用的the POSIX read() specification的关键部分是粗体:

  

尝试读取文件(管道或FIFO除外)时   支持非阻塞读取,目前没有可用的数据:

     
      
  • 如果设置了O_NONBLOCKread()将返回-1并将errno设置为[EAGAIN]

  •   
  • 如果O_NONBLOCK已清除,read()将阻止调用线程,直到某些数据可用。

  •   
  • 如果有一些数据可用,则O_NONBLOCK标志的使用无效。

  •   

必须设计和编写底层文件系统以支持非阻塞读取,并且大多数文件系统不会对文件执行此操作。

不可能知道为什么文件系统开发人员没有编写许多支持O_NONBLOCK的文件系统(如果有的话......),但这可能是因为它对文件没用。文件对象具有状态 - 文件系统知道是否有数据可用,并且没有外部依赖性,某些数据可能突然以不影响文件状态的方式出现。

虽然“你读过整个文件”不同于“管道中没有任何内容(尚未)”,但返回给调用者的信息并没有那么大的区别。