在C中使用fgets()作为非阻塞调用是否安全?

时间:2017-02-28 22:24:03

标签: c fgets nonblocking

从这个post听起来fgets()是一个阻塞调用,但是,this手册页显示如果设置为非阻塞,它将返回{{1}如果没有数据准备好被读取,那么NULL将是errno,所以我的假设是确实可以将它用作非阻塞数据。

我知道EWOULDBLOCK和朋友,我只是想知道将其用作非阻止是否安全?如果不是,那是什么原因?

1 个答案:

答案 0 :(得分:0)

  

我只想知道将它用作非阻塞是否安全?如果不是,那是什么原因?

这取决于你所说的“安全”。 C本身没有非阻塞I / O的概念,所以如果你编写的代码必须是广泛可移植的,那么即使假设非阻塞I / O是一种可用的替代方案也是不安全的。

如果您正在为更具体的环境(例如POSIX环境)编写代码,那么您可以依赖非阻塞I / O的可用性,但您应该考虑该环境的规范来确定当您指定给它的文件在某种相关意义上是非阻塞模式时,您可能期望fgets()的行为。 POSIX确实指出fgets()fgetc()所做的相同条件下失败并出现错误,其中一个是

  

为文件描述符基础流设置O_NONBLOCK标志,并且线程将在[fgets()]操作中延迟。

在这种情况下,如果你将“safe”定义为“由POSIX指定”,则是,依赖于fgets()不阻止底层底层打开文件描述处于非阻塞模式时安全

@R ..在评论中断言,在非阻塞模式下使用stdio函数可能会导致数据丢失。这似乎是合理的,但我还没有找到这个断言的依据。然而,我不准备在这一点上与他发生矛盾,所以,你所建议的是否“安全”取决于你所说的那个术语。