在 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" 取决于你所说的那个词的意思。
从这个 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" 取决于你所说的那个词的意思。