#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()
, чтобы родительский процесс ожидал дочернего процесса.