linux之是否可以启动一个 linux 进程,获取 PID,但在某些条件下稍后开始运行
我正在考虑一些可以在启动时暂停程序的工具。
例如,my_bin
立即开始运行。
$ ./my_bin
有了这个工具
$ magic_tool ./my_bin
my_bin
将启动。我可以得到 PID
。然后我可以稍后开始实际运行。
请您参考如下方法:
我刚刚在评论中测试了我的建议,它奏效了!这是我的 magic_tool.c
中的代码:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main (int argc, char *argv[])
{
pid_t pid;
printf("Executing %s to wrap %s.\n", argv[0], argv[1]);
pid = fork();
if (pid == -1)
return -1;
if (pid == 0) {
raise(SIGSTOP);
execl(argv[1], "", NULL);
} else {
printf("PID == %d\n", pid);
}
return 0;
}
我写了另一个测试程序target.c
:
#include <stdio.h>
int main ()
{
puts("It works!\n");
return 0;
}
正在运行 ./magic_tool ./target
打印一个 PID 并返回到 shell。只有在运行 kill -SIGCONT <printed_pid>
之后是 It works!
打印。您可能希望将 PID 保存在其他地方,并在 magic_tool
中执行一些检查。 ,但我认为这仍然是一个很好的概念证明。
编辑:
我对此进行了更多尝试,但由于某种原因它并不总是有效(请参阅下面的原因)。解决方案很简单 - 只需遵循正确的 fork off and die magic_tool.c
中的模式更紧密一些:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main (int argc, char *argv[])
{
pid_t pid;
printf("Executing %s to wrap %s.\n", argv[0], argv[1]);
pid = fork();
if (pid == -1)
return -1;
if (pid == 0) {
setsid();
pid = fork();
if (pid == -1)
return -1;
if (pid == 0) {
raise(SIGSTOP);
if (execl(argv[1], "", NULL))
return -1;
}
printf("PID == %d\n", pid);
}
return 0;
}
我在 this answer 中找到了解释:
When you start the root process from your shell, it is a process group leader, and its descendants are members of that group. When that leader terminates, the process group is orphaned. When the system detects a newly-orphaned process group in which any member is stopped, then every member of the process group is sent a SIGHUP followed by a SIGCONT.
So, some of your descendant processes are still stopped when the leader terminates, and thus everyone receives a SIGHUP followed by a SIGCONT, which for practical purposes mean they die of SIGHUP.
Exactly which descendants are still stopped (or even just merrily advancing toward exit()) is a timing race.
答案还链接到 IEEE Std 1003.1-2017 _Exit entry其中包含有关此事的更多详细信息。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。