【问题标题】:daemon dies when I terminate parent process [duplicate]当我终止父进程时,守护进程死亡[重复]
【发布时间】:2018-07-28 05:32:26
【问题描述】:

我希望 ubuntu linux 上的以下代码创建一个守护进程,它是 systemd 的子进程并不断打印“做某事”。

#include <unistd.h>
#include <stdlib.h>

int main()
{
    int pid1, pid2;
    int status;

    if (pid1 = fork()) {
        waitpid(pid1, &status, NULL);
    }
    else if (!pid1) {
        if (pid2 = fork()) {
            // use exit. return sometimes stop forking
            exit(0);
        }
        else if (!pid2) {
            while(1) {
                sleep(1);
                puts("do something");
            }
        }
        else {
            perror("error occured");
            return -1;
        }
    }
    else {
        perror("error occured");
        return -1;
    }

    while(1) {
        sleep(1);
        puts("parent do something.");
    }
}

但是当我中断父进程时,它生成的守护进程也会终止。当我在后台运行代码时,守护进程才活着。为什么会这样?

当我在后台运行时守护进程还活着。

$ ./a.out &

parent do something.
do something
parent do something.
do something
(ctrl + c)
do something
do something
do something

当我不在后台运行时,守护进程终止。

$ ./a.out

parent do something.
do something
parent do something.
do something
(ctrl + c)
// not printing anymore
$

【问题讨论】:

    标签: linux fork


    【解决方案1】:

    当您在前台运行时,终端生成的中断信号会发送到组(父级和子级)。 the following unix exchange answer 有更多相关信息。

    在后台运行时,进程不会监听终端的中断信号。所以按ctrl+c根本没有效果。

    【讨论】: