我已经读过在混合线程和分叉时可能发生a lot,最好避免使用它。我发现自己处于一种我无法做出选择的情况,并且我收到内核模块的内核崩溃。
我减少的测试用例有2个线程。其中一个是在循环中对一个开放的设备节点进行ioctls。另一个是做一个叉子,等待孩子退出,立即做。如果我使用pthread_atfork
将我的线程与fork-call同步,那么它正在工作。
我可以在哪里查看有关正在执行ioctl
的打开文件描述符的分叉期间发生的事情的更多信息?会发生什么样的腐败?
编辑:Andreas让我改变了我的测试用例。我没有让孩子立即离开,而是在退出前不等10秒钟。我收集了父进程中的所有PID,以便稍后执行waitpid。我分叉了100次。如果在2或3个叉子之后使其崩溃。
答案 0 :(得分:1)
在这方面,线程不应该引起任何问题。特别应该没有内核崩溃。
从您的描述中可以看出,您正在编写自己的内核模块来处理有问题的文件描述符。请注意,分叉进程获取所有打开文件描述符的副本。当它退出时它会关闭那些。
除了立即退出之外什么也没做什么并不重要,关闭(和file_operations中的flush)总是发生。那是你应该查看内核代码的地方。