在C中,有没有办法检测对libc' fread
的调用是否会阻塞?我想从文件描述符中读取数据,但前提是它可用。我使用的是GNU + Linux,但我正在编写一个库,所以我正在寻找最便携的解决方案。
答案 0 :(得分:1)
假设文件指针指向非常规文件,并且可能是使用fdopen()
创建的,则一种解决方案是从fread()
切换到read()
并使用{{1}检查套接字是否会阻塞。这适用于当今所有类Unix系统。
如果你的库收到一个文件指针并且必须在整个过程中使用它(因为API要求它),上面的方法将不起作用,也不会在底层文件描述符上调用select()
。问题是由于缓冲,select
可能根本不会调用底层fread()
,或者它可能会多次调用它。在这种情况下,唯一可移植的解决方案是在单独的线程中使用阻塞read()
,并在读取完成时通知实现API的线程。