C: 如果文件描述符被删除,阻塞读取应该返回

标签 c linux multithreading pthreads

我正在以阻塞的方式从设备/文件描述符读取。 可能会发生,在不同的线程中关闭设备并删除文件描述符。不幸的是,读取没有返回或注意到并一直阻塞。

作为一种解决方法,我可以执行一个 while 循环,将选择作为超时。如果发生超时,我可以检查文件描述符,以防它不调用读取而是返回。

我在想,在 Linux-C 中是否有更好的方法?

最佳答案

您所描述的代码具有固有的竞争条件 - 如果在您close() 文件时另一个线程可能正在阻塞文件描述符上的 read()描述符,另一个线程也可以调用 read()

您不能调用 close(),除非您知道所有其他线程根本不再能够使用该文件描述符。

处理您描述的情况的最简单方法是让一个线程成为每个文件描述符的“拥有”线程,负责关闭文件描述符。其他线程不会直接关闭它 - 而是在某些共享数据结构中将文件描述符标记为“待关闭”并唤醒拥有线程。

您可以通过不阻塞 read() 而是阻塞 select()poll() 来唤醒拥有线程 与集合中的另一个文件描述符(通常是管道)以及目标文件描述符。通过写入该管道的另一端来唤醒线程。

关于C: 如果文件描述符被删除,阻塞读取应该返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40301754/

相关文章:

linux - 为什么 spawn scp 不能正常工作?

linux - 用于从原始文本文件中的列中删除字符的系统命令

java - Grails 和多线程进程

c - 为什么它返回 0 或 1 而不是 True 或 False

c - memcpy_s 返回错误 404 是什么意思

c - malloc 函数在 C 程序中无法正常工作。程序崩溃

C++ 互斥锁定错误

正确使用 POSIX 的 pthread_exit 和 pthread_join

Linux kill -9 PID 杀进程

multithreading - 蒙戈 : eliminating race condition on conditional update