Getpid и getppid возвращают два разных значения
Когда я запускаю код ниже
#include <stdio.h>
#include <sys/types.h>
//int i=0;
int main(){
int id ;
id = fork() ;
printf("id value : %d\n",id);
if ( id == 0 )
{
printf ( "Child : Hello I am the child process\n");
printf ( "Child : Child’s PID: %d\n", getpid());
printf ( "Child : Parent’s PID: %d\n", getppid());
}
else
{
printf ( "Parent : Hello I am the parent process\n" ) ;
printf ( "Parent : Parent’s PID: %d\n", getpid());
printf ( "Parent : Child’s PID: %d\n", id);
}
}
Мой вывод
id value : 20173
Parent : Hello I am the parent process
Parent : Parent’s PID: 20172
Parent : Child’s PID: 20173
id value : 0
Child : Hello I am the child process
Child : Child’s PID: 20173
Child : Parent’s PID: 1
Как родительский PID (20172) отличается от родительского идентификатора ребенка (1)? Разве эти два не равны?
Ответы
Ответ 1
Что происходит, так это то, что родитель заканчивается перед запуском ребенка. это оставляет ребенка как сироту, и он принимается корневым процессом с PID равным 1. Если вы помещаете задержку или читаете данные из stdin, а не позволяете родительскому терминалу, вы увидите ожидаемый результат.
Процесс Идентификатор 1 обычно является процессом инициализации, который в первую очередь отвечает за запуск и завершение работы системы. Init (short for initialization) - это процесс демона, который является прямым или косвенным предком всех других процессов. ссылка wiki для init
Как указывает user314104, функции wait() и waitpid() предназначены для того, чтобы позволить родительскому процессу приостанавливаться до изменения состояния дочернего процесса. Таким образом, вызов wait() в родительском ветки вашего оператора if заставит родителя ждать завершения дочернего процесса.
Ответ 2
Поскольку родительский процесс завершается и освобождается, его дочерний процесс становится сиротой, init (short для инициализации), pid которого равен 1, получил сиротский процесс.