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

Is it safe to use fgets() as non-blocking call in C?

从这个 post it sounds like fgets() is meant to be a blocking call, however, this 手册页显示,如果设置为非阻塞,它将 return NULL 并且 errno 将是 EWOULDBLOCK 如果没有数据已准备好读取,所以我的假设是确实可以将其用作非阻塞。

我知道 select() 和朋友们,我只是想知道将它用作非阻塞是否安全?如果不是,原因是什么?

I'd just like to know if it's safe to use it as non-blocking? and if it's not, what are those reasons?‎

这取决于你所说的 "safe" 是什么意思。 C 本身没有非阻塞 I/O 的概念,因此如果您编写的代码必须具有广泛的可移植性,那么即使假设非阻塞 I/O 是一个可用的替代方案也是不安全的。

如果您正在为更具体的环境编写代码,例如 POSIX 环境,那么您可以依赖非阻塞 I/O 的可用性,但您应该考虑该环境的规范,以确定当您指定给它的文件在某种相关意义上处于非阻塞模式时,您可以从 fgets() 期望什么行为。 POSIX does specify that fgets() shall fail with an error under the same conditions that fgetc() 有,其中之一是

The O_NONBLOCK flag is set for the file descriptor underlying stream and the thread would be delayed in the [fgets()] operation.

在这种情况下,如果您将 "safe" 定义为 "specified by POSIX" 那么是的,依赖 fgets() 在底层打开文件描述处于非-阻塞模式是安全的。

@R.. 在评论中断言,在非阻塞模式的文件上使用 stdio 函数可能会导致数据丢失。这是有道理的,但我还没有找到这种说法的基础。我不准备在这一点上反驳他,但是,再说一遍,你的提议是否 "safe" 取决于你所说的那个词的意思。