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, получил сиротский процесс.