Multithreading 当另一个线程正在分叉时,在线程中完成ioctl/syscall时会发生什么?

Multithreading 当另一个线程正在分叉时,在线程中完成ioctl/syscall时会发生什么?,multithreading,linux-kernel,linux-device-driver,ioctl,fork,Multithreading,Linux Kernel,Linux Device Driver,Ioctl,Fork,我已经读到,当混合线程和分叉时可能会发生这种情况,最好避免这种情况。我发现自己处于一种无法选择的境地,我的内核模块出现了内核崩溃 我的简化测试用例有2个线程。其中之一是对循环中的开放设备节点执行IOCTL。另一个正在执行一个fork,等待子进程退出,它会立即退出。如果我使用pthread\u atfork将我的线程与fork调用同步,那么它正在工作 我可以从哪里了解更多关于当前正在执行ioctl的fork-on-open文件描述符期间发生的情况?什么样的腐败会发生 编辑:Andreas让我更改了

我已经读到,当混合线程和分叉时可能会发生这种情况,最好避免这种情况。我发现自己处于一种无法选择的境地,我的内核模块出现了内核崩溃

我的简化测试用例有2个线程。其中之一是对循环中的开放设备节点执行IOCTL。另一个正在执行一个fork,等待子进程退出,它会立即退出。如果我使用
pthread\u atfork
将我的线程与fork调用同步,那么它正在工作

我可以从哪里了解更多关于当前正在执行
ioctl
的fork-on-open文件描述符期间发生的情况?什么样的腐败会发生


编辑:Andreas让我更改了我的测试用例。我不会让孩子立即退出,而是在退出前等待10秒。我正在收集父进程中的所有PID,以便稍后执行waitpid。我用叉子叉了100次。如果在2个或3个叉后使其崩溃。

在这方面,穿线应该不会造成任何问题。尤其应该没有内核崩溃

根据您的描述,听起来您正在编写自己的内核模块来处理所讨论的文件描述符。请注意,分叉进程获取所有打开的文件描述符的副本。当它退出时,它会关闭这些


显然,它除了立即退出之外什么都不做并不重要,关闭(以及文件中的刷新操作)总是发生。这就是您应该查看内核代码的地方。

谢谢Andreas。我更新了我的测试用例,多亏了您的关闭想法,但问题仍然存在。我不确定是否结束交易。在执行fork时,我没有在内核模块中接收到
版本
-syscall。@PatrickB。直到最后一次关闭,也就是说,直到没有引用该文件的文件描述符,您才会获得发布。不过你应该有同花顺。