在 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/