linux之是否可以启动一个 linux 进程,获取 PID,但在某些条件下稍后开始运行

Free-Thinker 阅读:13 2024-07-26 13:47:55 评论:0

我正在考虑一些可以在启动时暂停程序的工具。

例如,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其中包含有关此事的更多详细信息。


标签:linux
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号