我读到,在混合线程和分叉时可能会发生很多情况,最好避免这种情况。我发现自己陷入了一种别无选择的境地,我收到了内核模块的内核崩溃。
我的精简测试用例有2个线程。其中之一是对循环中打开的设备节点执行ioctl。另一个正在做一个分叉,等待孩子退出,然后立即退出。如果我使用pthread_atfork
将我的线程与fork调用同步,它就可以工作了。
我可以在哪里查看,以了解当前正在执行ioctl
的打开文件描述符上的分叉过程中发生的更多情况?会发生什么样的腐败?
编辑:Andreas让我更改了我的测试用例。与其让孩子立即离开,我不会等10秒钟才离开。我正在收集父进程中的所有PID,以便稍后进行等待。我分叉了100次。如果在2或3个叉子后使其碰撞。
线程在这方面应该不会造成任何问题。尤其不应该出现内核崩溃。
根据您的描述,听起来您正在编写自己的内核模块来处理有问题的文件描述符。请注意,分叉进程获取所有打开的文件描述符的副本。当它退出时,它会关闭这些。
它除了立即退出之外什么也不做并不重要,关闭(和刷新file_operations)总是会发生。这就是您应该在内核代码中查找的地方。