дочерний процесс печатает неправильный ppid()

#c #linux #fork #pid

#c #linux #форк #pid

Вопрос:

Почему в этой программе дочерний процесс печатает неправильный ppid()?

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

void childprocess()
{
  printf("Child: Hi I am the child processn");
  printf("Child: My process id is %dn", getpid());
  printf("Child: My parent is %dn", getppid());
  printf("Child: I am exitingn");
}

void parentprocess()
{
   printf("Parent: Hi I am the parent processn");
   printf("Parent: My process id is %dn", getpid());
   printf("Parent: My parent is %dn", getppid());
   printf("Parent: I am exitingn");
}

int main()
{
    pid_t n = fork();
    if(n<0)
    {
      perror("fork failed:");
      exit(EXIT_FAILURE);
    }
    else if(n==0)
       childprocess();
    else
       parentprocess();
}
  

Вывод:

 Parent: Hi I am the parent process
Parent: My process id is 21550
Parent: My parent is 7452
Parent: I am exiting
Child: Hi I am the child process
Child: My process id is 21551
Child: My parent is 1810
Child: I am exiting
  

Если я повторю выполнение. Иногда результат — это то, что я ожидаю, а иногда это неожиданно.

Комментарии:

1. попробуйте добавить sleep(); в родительский процесс, и я полагаю, вы получите то, что ожидаете. Проблема может заключаться в следующем en.wikipedia.org/wiki/Orphan_process

Ответ №1:

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

В моем случае это выскочка с идентификатором процесса 1810.

Upstart — это основанная на событиях замена /sbin/init

Ответ №2:

Действительно, нет никакой гарантии, что планировщик сначала запланирует дочерний процесс. Родительский процесс может завершиться до запуска дочернего процесса. И поскольку в Linux у каждого процесса есть родительский процесс (за исключением процесса swapper), сиротский дочерний процесс присваивается init .

Вы можете добавить wait() , чтобы родительский процесс ожидал дочернего процесса.