C、检测fread是否会阻塞

标签 c blocking fread system-calls

在 C 中,有没有办法检测对 libc 的 fread 的调用是否会阻塞?我想从文件描述符中读取数据,但前提是它可用。我正在使用 GNU+Linux,但我正在编写一个库,所以我正在寻找尽可能便携的解决方案。

最佳答案

假设文件指针指向一个非常规文件,并且大概是用 fdopen() 创建的,一个解决方案是从 fread() 切换到 read() 并使用 select() 检查套接字是否会阻塞。这对于当今所有的类 Unix 系统都是可移植的。

如果您的库接收到一个文件指针并且必须始终使用它(因为 API 要求它),则上述方法将不起作用,并且在底层文件描述符上调用 select 也不会起作用。问题在于,由于缓冲,fread() 可能根本不会调用底层的 read(),或者它可能会多次调用它。在这种情况下,唯一可移植的解决方案是在单独的线程中使用阻塞 fread(),并在读取完成时通知实现 API 的线程。

关于C、检测fread是否会阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23976719/

相关文章:

c - 如何检测是否有新行然后忽略它(fgets)

c - 向指定端口写入/读取命令

delphi - 创造 *。 Mht 文件(网络存档)

c - 来自 C++ Reference 的 fread 示例

c - 这个 C for 循环如何打印文本艺术金字塔?

c - 如何根据输入的数字将答案设为 float 或整数?

java - 阻塞队列元素对其他线程不可见,有时会导致无法检索元素

java - 如何终止由于Socket.accept()而被阻塞太长时间的线程?

r - 将大型数据集加载到 R 中的最快方法和最快格式是什么

c - C 中的文件读取。 fread 函数的并发症