我正在从设备/文件描述符中以阻塞方式读取数据。可能会出现在另一个线程中关闭设备并删除文件描述符的情况。不幸的是,读操作不会返回或注意到这一点,而是继续阻塞。
作为一种解决方法,我可以使用select函数设置超时的while循环。如果发生超时,我可以检查文件描述符,如果已经不存在,则不进行读取操作,而是直接返回。
我想知道,在Linux-C中是否有更好的方法?
我正在从设备/文件描述符中以阻塞方式读取数据。可能会出现在另一个线程中关闭设备并删除文件描述符的情况。不幸的是,读操作不会返回或注意到这一点,而是继续阻塞。
作为一种解决方法,我可以使用select函数设置超时的while循环。如果发生超时,我可以检查文件描述符,如果已经不存在,则不进行读取操作,而是直接返回。
我想知道,在Linux-C中是否有更好的方法?
read()
,而你却调用了close()
关闭了该文件描述符,那么另一个线程也可能正在准备调用read()
。close()
。read()
中阻塞,而是在select()
或poll()
中阻塞,其中包括另一个文件描述符(通常是管道)作为目标文件描述符和集合中的一部分。通过向该管道的另一端写入内容来唤醒线程。
close()
并且在此期间没有被其他线程“回收”,则读取将失败并返回-1,这不一定等于EOF
。 - alkfd = NULL
不是一个好主意(NULL
是一个 指针 值!),因为这会把fd
(它是一个int
)赋值为0
,这几乎总是一个 有效的文件描述符。如果要标记文件描述符为无效,请使用任何<0
的值。或者你应该使用由fopen()
返回的 文件句柄/指针,类型为FILE*
。 - alk