gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:00 24 4
gpt4 key购买 nike

从这里post这听起来像 fgets() 是一个阻塞调用,然而,this手册页显示,如果设置为非阻塞,它将返回 NULL 并且 errno 将是 EWOULDBLOCK 如果没有数据准备好读取,所以我的假设是确实可以将其用作非阻塞。

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

最佳答案

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?‎

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

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

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

在这种情况下,如果您将“安全”定义为“由 POSIX 指定”,那么是的,依赖于 fgets() 在底层打开文件描述位于非阻塞模式是安全的。

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

关于c - 在 C 中使用 fgets() 作为非阻塞调用是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42519863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com