我有一个简单的 Shell 脚本,其中多个可执行文件将按顺序运行。每次新的可执行文件开始运行时,都会启动一个具有新 PID 的新进程。是否可以使用相同的 PID 运行它们?我知道对于 shell 脚本,我们可以使用“源”。但我不知道如何处理可执行文件。
2 回答
原则上,我认为它应该是可能的,但在实践中它会非常复杂和脆弱。
Linux 中的exec
系统调用系列允许一个进程用一个全新的进程替换自己,该进程保持相同的 PID。棘手的部分是以某种方式从第二个过程“返回”到第一个过程。当exec
被调用时,操作系统会加载它开始运行新进程所需的一切,并清除与当前进程(被替换的进程)相关的每一个状态。当新进程终止时,操作系统会释放与该进程关联的所有资源(包括 PID)。
因此,如果您真的想这样做,您将不得不劫持进程如何终止以重新启动原始进程,而不是让操作系统清理所有内容。你怎么能做到这一点?好吧,execle
函数execvpe
允许程序在启动进程之前指定新进程的环境。由于每个进程都依赖libc
(或等效)来启动/拆除一个进程,因此您应该能够提供一个自定义libc
来重新开始执行您的脚本或exec
另一个进程。最大的困难是破解这样的libc
. 此外,即使操作系统擦除了它在调用时可能使用的任何内存,您也必须为您的主程序找到一种保持状态的好方法exec
. 您可能可以使用临时文件来完成此操作。
长话短说,不要这样做。虽然我坐在这里思考实现这一目标所需的大量黑客技术很有趣,但这将是一个巨大的痛苦,我相信对于你实际尝试的任何问题都有一个更优雅的解决方案解决。
PID 在 shell 创建新进程时由 OS 分配。没有办法告诉操作系统使用某些特定的 PID。所以这是不可能的。