2015-02-18 17 views
0

Я получаю разное количество выходов в приведенном ниже коде. Иногда он печатает 6 PID или иногда 8 PID. Требуемый выход - 7 PID. Хотя иногда я могу получить 7 PID.Различные выходы в процессе разветвления

Дерево процессов:

  A 
    /| \ 
     B C D 
    /\ | 
    E F G 

Мой код:

#include <stdio.h> 

void main() 
{ 
    int pidb=-1; 
    if(fork()==0) pidb=getpid(); 
    fork(); 
    if(getppid()!=pidb) fork(); 
    printf("%d\n",getpid()); 
} 

Примечание: Предположим, что вызов вилка будет успешным.

[обновление]

Мы должны достичь его с помощью 3 вилы вызовов.

ответ

1
#include <stdio.h> 

    void main() 
    { 
     int pidb=-1; 
     if(fork()==0) pidb=getpid(); 
     fork(); 
     if(getppid()!=pidb) fork(); 
     wait(NULL); // Wait for all child process 
     printf("%d\n",getpid()); 
    } 

Это то, что вы хотите. Это будет печатать 7 PID из этих 7 процесса


Окончательный дерево процесс будет как этот

  A (First fork) 
    / \ 
     B  c (2nd fork) 
    /\ /\ 
    D E F G (3rd fork) 
/\/\ /\ | 
    1 2 3 4 5 6 7 
+0

В чем заключается необходимость включения вызова wait()? –

+0

@sidkamaria, если вы не будете ждать в основном процессе, тогда, когда ваш дочерний процесс будет продолжен, а основной процесс завершится, его дочерний элемент также будет разорван, чтобы ваш отпечаток не появился –

+1

. Pid определяется как «pid_t», а не как int. – user3629249

1

Вы забыли включить необходимые файлы заголовков. использовать fork(), вам нужно иметь

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

С этим, я в состоянии получить ожидаемый результат.

Это, в вашем коде, кажется, вы не дожидаетесь завершения дочерних процессов.

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

Кроме того, это не void main(), фактически int main(void). a return 0 в конце хорошая практика.

+0

Вы можете уточнить? Зачем ему печатать 8 выходов, даже если есть инструкция «if». –

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