Неожиданный идентификатор родительского процесса в выводе

Неожиданный идентификатор родительского процесса в выводе

Мой код разветвляет процесс и выводит PID и PPID каждого процесса. Я ожидал, что PPID дочернего процесса будет таким же, как PID родительского процесса, но он не появляется таким образом.

Я использую Ubuntu 14.04.

#include <stdio.h>
#include <sys/wait.h>

int main(){
    int pid;
    pid = fork();
    if(pid==0){
        printf("\nI am the child and my parent id is %d and my id %d\n", getppid(), getpid());
    }
    else
        printf("\nI am the parent and my pid is %d and my parent id is %d\n", getpid(), getppid());

    return 0;
}

Вот что я получаю на выходе:

I am the parent and my pid is 29229 and my parent id is 27087
I am the child and my parent id is 1135 and my id is 29230

решение1

Я предполагаю: родительский процесс вернулся раньше дочернего, который стал сиротой. PID 1135 должен быть вашим пользовательским процессом init, который стал новым родителем процесса. (в сеансе пользователя Ubuntu есть 2 подпроцесса жатки).

$ ps -ef | grep init
you    1135    ...    init --user

Если вы хотите, чтобы ваш родительский элемент ждал своего потомка, используйте wait. На самом деле у вас includeуже есть:

#include <stdio.h>
#include <sys/wait.h>

int main(){
    int pid;
    pid = fork();
    if(pid == 0)
        printf("\nI am the child and my parent id is - %d and mine id %d\n",getppid(),getpid());
    else{
       printf("\nI am the parent and my pid is %d and my parent id is %d\n",getpid(),getppid());
       wait(NULL);
    }
    return 0;
}

Это гарантирует, что родительский процесс не выйдет раньше дочернего printf. Вы можете увидеть это поведение более наглядно, вставив несколько sleep()вызовов здесь и там, чтобы увидеть, в каком порядке все происходит.

Для получения дополнительной информации о подсборщиках,посмотрите здесь.

Связанный контент