我有一个守护进程,我不断地启动它,并在循环中执行“kill-9”,以便对特定用例进行压力测试。这个守护进程加载一个共享库,然后打开一个fd。( fd的打开/关闭在内核中处理的另一个共享库代码中)。我观察到在内核库中执行清理操作时,它会在清理之前检查来自task_structs (tgid)的PID值。现在我的观察:我有时看到,当守护进程被杀死时,我没有看到相关的tgid值,相反,我看到一个奇怪的进程ID值,它是“绑定器进程”。因此,我在内核代码中的清理操作不会对被'kill -9‘杀死的那个进程ID生效。
任何人都知道为什么current->tgid值是活页夹进程的值,而不是被终止的守护进程的值。请注意,我的守护进程确实链接到'libbinder‘。我不确定这是否能起到作用。如果我从我的守护进程中删除到'libbinder‘及其相关代码的链接,一切看起来都很正常
有什么建议/想法吗?
发布于 2011-05-17 13:13:50
如果您的用户空间进程打开一个文件,然后派生另一个进程,则打开的文件将在派生的进程中复制(该libbinder很可能派生出另一个进程)。
内核中file_operations结构的close方法只会在最后一个文件引用被put时调用。如果两个进程几乎同时死掉,那么最终调用close方法的进程将是第二个死掉的进程。
您的内核代码不应该依赖于tgid。它应该将清理操作所需的数据附加到struct file,而不是附加到task_struct。
https://stackoverflow.com/questions/5996943
复制相似问题