2017-01-15 2 views
0

Для того, чтобы объяснить вопрос, который я задаю давайте рассмотрим этот код,Когда дочерний процесс создается с вилкой, родитель ID не так же, как и родительский ID

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() {  
    pid_t child, parent; 
    parent = getpid(); 
    printf("Main parent pid: %d\n",parent); 

    if((child = fork()) < 0) { 
     printf("Error\n"); 
    } else if(child == 0) { 
     printf("A Child process is created, pid: %d, ppid: %d \n", 
      getpid(), getppid()); 
    } else if(child > 0) { 
     printf("Parent says: Child pid: %d, getpid: %d, getppid: %d\n", 
       child, getpid(), getppid()); 
    } 
    return 0; 
} 

Когда я выполняю это код на терминале я получаю такой вывод данных

Main pid: 711 

Parent says: Child pid: 712, getpid: 711, getppid: 598 

A Child process is created, pid: 712, ppid: 1 

насколько я понимаю, когда я создаю новый процесс порождения из уже созданного процесса, родитель этого нового процесса должен процесс, который я раздвоенный . Как вы можете видеть на выходе, родительский идентификатор процесса для ребенка равен 1, то есть init процесс, так почему же так? Я понимаю, что неправильно, или есть какие-то другие вещи, которые я не вижу?

Примечание: Я работаю над Mac OSX.

+0

Это это ужасный макет. Если вы программируете в Pico, используйте его. Если вы программируете на C, используйте ортодоксальный макет C - не это. –

ответ

3

Проблема заключается в том, что родительский процесс (711) умер, а дочерний процесс унаследован процессом init (1), прежде чем он получит отчет. Если у вас есть родитель, ожидающий, пока ребенок умрет, прежде чем выйти из него, вы увидите ожидаемый результат.

Чтобы продемонстрировать:

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

int main(void) 
{ 
    pid_t child, parent; 
    parent = getpid(); 
    printf("Main parent pid: %d\n", (int)parent); 

    if ((child = fork()) < 0) 
    { 
     printf("Error\n"); 
    } 
    else if (child == 0) 
    { 
     printf("A Child process is created, pid: %d, ppid: %d\n", 
       (int)getpid(), (int)getppid()); 
    } 
    else if (child > 0) 
    { 
     printf("Parent says: Child pid: %d, getpid: %d, getppid: %d\n", 
       (int)child, (int)getpid(), (int)getppid()); 
#ifndef DO_NOT_WAIT_FOR_CHILD 
     int status; 
     int corpse = wait(&status); 
     printf("Child %d exited with status 0x%.4X\n", corpse, status); 
#endif 
    } 
    return 0; 
} 

При компиляции без -DDO_NOT_WAIT_FOR_CHILD, я получил пример вывода:

Main parent pid: 77646 
Parent says: Child pid: 77647, getpid: 77646, getppid: 46383 
A Child process is created, pid: 77647, ppid: 77646 
Child 77647 exited with status 0x0000 

При компиляции с -DDO_NOT_WAIT_FOR_CHILD, я получил пример вывода:

Main parent pid: 77662 
Parent says: Child pid: 77663, getpid: 77662, getppid: 46383 
A Child process is created, pid: 77663, ppid: 1 
+0

Я протестировал то, что вы сказали, и работал, спасибо :) – onurcanbektas

Смежные вопросы