C,检测fread是否会阻塞

时间:2014-06-01 04:18:31

标签: c blocking fread system-calls

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

1 个答案:

答案 0 :(得分:1)

假设文件指针指向非常规文件,并且可能是使用fdopen()创建的,则一种解决方案是从fread()切换到read()并使用{{1}检查套接字是否会阻塞。这适用于当今所有类Unix系统。

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