重新育儿停止过程

时间:2016-03-16 14:59:55

标签: c linux process ps

如何重新制作已停止的流程?为什么停止进程在重新生成父母后才会终止?

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

#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 <child_pid>

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

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

为什么这种情况会在重新育儿后停止进程而死?是否有可能在linux中重新停止进程?

1 个答案:

答案 0 :(得分:3)

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

  

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

另请参阅:What's the difference between SIGSTOP and SIGTSTP?