创建一个不是创建它的进程子进程的进程

时间:2011-12-29 16:02:53

标签: c linux gcc fork

我想从流程 A 创建流程 B 。但是,我不希望 B 成为 A 的孩子,如果我只是使用 fork 就是这种情况。我怎样才能做到这一点?换句话说,即使进程 A 被杀死,我也希望进程 B 继续执行。

4 个答案:

答案 0 :(得分:7)

您可以使用setsid()函数。

或者,正如你已经标记了你的问题“linux”,也许你想使用daemon()而不是fork()+ setsid()。

答案 1 :(得分:4)

如果 B A A 的孩子,为什么你认为 B 会在 A 被杀后继续执行STRONG>?那不是真的。

但如果您仍然希望 B 不是 A 的孩子,那么您可以fork()两次执行此操作:一次创建一个孩子< strong>A½,一次创建 B 。 B是的孩子, A 的孙子。然后立即退出 B 将由init继承,并且与 A 没有任何进一步的关系。

如果您担心响应于广播到整个前台进程组的Control-C按键等事件而生成的SIGHUPSIGINT等信号,请参阅cnicutar的答案。

答案 2 :(得分:2)

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
    pid_t pid;

    switch(pid = fork()) {
    case -1: 
        perror("fork");  
        exit(1);             

    case 0:
        printf(" CHILD: This is the child process!\n");
        printf(" CHILD: My PID is %d\n", getpid());
        printf(" CHILD: My parent's PID is %d\n", getppid());
        /* you can exec another program here if you wish to */
        printf(" CHILD: I'm outta here!\n");
        break;

    default:
        printf("PARENT: This is the parent process!\n");
        printf("PARENT: My PID is %d\n", getpid());
        printf("PARENT: My child's PID is %d\n", pid);
        printf("PARENT: I'm not going to wait for my child to exit\n");
        signal(SIGCHLD, SIG_IGN);
        printf("PARENT: I'm outta here!\n");
    }   

    return 0;
}

如果您没有发送signal(),那么在父母完成执行(并退出)之后,子进程将被称为僵尸进程。为了更好地理解,请执行以下程序。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

/*
Execute this program and do 'ps ax | grep Z' to see that this
is put in a defunct state or zombie state
*/

int main()
{
        pid_t child_pid;

        child_pid = fork();
        if (child_pid > 0) {
                sleep(60);
        } else {
                return 0;
        }

        return 0;
}

答案 3 :(得分:1)

我看到的唯一方法是让孩子孤儿(然后由init采用)。 这可以通过在孩子之前终止父进程来实现(但只是处理信号传播)。

可能会找到一些不错的样本here