【问题标题】:re-parenting stopped process重新养育停止的过程
【发布时间】:2016-03-16 14:59:54
【问题描述】:

如何对已停止的进程进行重新设置?为什么停止的进程在重新育儿后就终止了?

更准确地说,假设我有这样的代码

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h> 
#include <sys/syscall.h>
#include <stdio.h>


int main(void) {
    pid_t child;

    child = fork();

    if (child == 0) {
        int t = 0;
        while (true) {
            printf("%d. I'm %d, my parent is %d\n", t++, getpid(), getppid());
            sleep(1);
        }
    } else {
        printf("I'm the parent. My pid is %d\n", getpid());
        printf("Starting to wait for 30 seconds\n");
        sleep(30);
        printf("Done waiting, aborting\n");
    }
}

当我运行这段代码时,子进程工作,父进程只是休眠。 30 秒后,父进程终止,子进程现在成为init 的子进程,继续运行。一切正常。

但是如果我运行这段代码并且在它执行的前 30 秒内我也会运行

kill -SIGSTOP &lt;child_pid&gt;

然后子进程停止(ps xaf 中的T 状态)并且父进程休眠。经过 30 秒后,父进程从睡眠中返回并终止(因为它到达 main 的末尾),但子进程在停止状态下没有被重新设置为 init,而是终止了。我在 ps xaf 中看不到它,如果运行 lastcomm 我看到这个输出:

a.out             F  X equi     pts/5      0.00 secs Wed Mar 16 17:44

为什么会发生这种情况,停止的进程在重新养育后死亡?在linux中是否可以重新启动停止的进程?

【问题讨论】:

  • 你为什么要这样做?
  • @nzc 有criu 之类的东西(参见criu.org 或github.com/xemul/criu)我想在criu restore 中添加功能--leave-stopped(目前仅适用于criu dump
  • 我认为如果您在问题中包含其中一些细节,您可能会获得更好的结果。我认为(但不确定)问题的一部分是您可能以不打算使用的方式使用作业控制信号。包括您为什么要使用它们的上下文可能会帮助知道的人解释原因并可能建议正确的方法。

标签: c linux process ps


【解决方案1】:

来自http://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html

当孤立进程组中的进程(请参阅孤立进程 组)接收 SIGTSTP、SIGTTIN 或 SIGTTOU 信号,但不接收 处理它,过程不会停止。停止该过程将 可能不是很有用,因为没有 shell 程序可以 注意它停止并允许用户继续它。相反会发生什么 取决于您使用的操作系统。有些系统可能会 没有;其他人可能会传递另一个信号,例如 SIGKILL 或 叹息。在 GNU/Hurd 系统上,进程因 SIGKILL 而死;这 避免了许多停止的孤立进程的问题 系统。

另见:What's the difference between SIGSTOP and SIGTSTP?

【讨论】:

  • 其实我不明白SIGTSTPSIGTTINSIGTTOU怎么会出现在这里。在您提供的文档中,“当一个进程组成为孤儿时,它的进程会收到一个 SIGHUP 信号”。此信号是否会导致我的子程序终止?如果是,为什么这个信号不会终止我的程序,以防它没有停止?
  • 我认为这里真正的原因是,“停止”是一种只有当进程具有“作业控制”时才有意义的状态,因为以后可以重新启动它。我认为当进程失去工作控制时,系统会向它发送一个 SIGHUP ,否则它将永远停止。见最后一行“......这避免了系统周围许多停止的孤立进程的问题。”
  • 另外,重新阅读您的评论,当您的进程没有停止时,没有发送“SIGHUP”。发送 SIGHUP 是因为您的进程在成为孤立进程时停止。
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
相关资源
最近更新 更多