Создание процесса, который не является дочерним по отношению к процессу, который его создал - PullRequest
2 голосов
/ 29 декабря 2011

Я хочу создать процесс B из процесса A . Однако я не хочу, чтобы B был потомком A , что будет иметь место, если я просто использую fork . Как я могу этого достичь? Другими словами, я хочу, чтобы процесс B продолжал выполняться, даже если процесс A завершен.

Ответы [ 4 ]

7 голосов
/ 29 декабря 2011

Вы можете использовать функцию setsid ().

В качестве альтернативы, поскольку вы пометили свой вопрос "linux", возможно, вы хотите использовать daemon () вместо fork () + setsid ().

4 голосов
/ 29 декабря 2011

Почему вы думаете, что B не будет продолжать выполняться после того, как A убит, если B является потомком A ? Это не правда.

Но если вы все еще хотите, чтобы B не был дочерним элементом A , то вы можете сделать это, дважды * fork(): один раз для создания дочернего элемента и один раз для создания B . B - ребенок и внук A . Затем немедленно выйдите из . B будет наследоваться init и больше не будет иметь отношения к A .

Если вас беспокоят такие сигналы, как SIGHUP и SIGINT, которые генерируются в ответ на такие события, как нажатие клавиши Control-C, которые передаются всей группе процессов переднего плана, см. cnicutar . ответить.

2 голосов
/ 29 декабря 2011
#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;
}
1 голос
/ 29 декабря 2011

Единственный способ, которым я вижу, это иметь ребенка-сироту (затем усыновленного init). Это может быть достигнуто путем прекращения родительского процесса перед ребенком (но просто позаботьтесь о распространении сигнала).

Некоторые интересные образцы можно найти здесь

...