2015-10-13 6 views
0

в моем назначении Я должен ввести 'n' и создать 'n' количество дочерних процессов. Оттуда ребенок обрабатывает execl в другую программу, в которой они спят для случайного количества секунд (между 0 и 9), а затем выходят с статусом выхода случайного числа. Когда они выйдут из родителя, я должен напечатать идентификатор PID ребенка и статус выхода ребенка. Мои проблемы заключаются в том, что я не уверен, как получить статус PID или выйти из системы без использования IPC. Вместе с тем «Ребенок мертв ...» выходят одновременно. Это то, что я придумал сейчас.Получение значения PID и выхода из дочернего процесса

Родитель:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

int main() 
{ 
     char input[12]; 
     int n, i, ch; 
     pid_t pid; 
     int status; 

     printf("Enter an integer: "); 
     fgets(input, 12, stdin); 
     if (input[10] == '\n' && input[11] == '\0') { while ((ch = fgetc(stdin)) != EOF && ch != '\n'); } 
     rmnewline(input); 

     n = atoi(input); 

     for(i=0; i<=n-1; i++) 
     { 
      pid = fork(); 
      if(pid == 0) 
      execl("/home/andrew/USP_ASG2/sleep", "sleep", NULL); 
     } 

     while(wait(NULL)>0) 
     { 
     if(WIFEXITED(status)) 
     { 
      int exitstat = WEXITSTATUS(status); 
      printf("Child %d is dead with exit status %d\n", pid, exitstat); 
     } 
     } 
} 

ребенок:

int main() 
{ 
    srand(time(NULL)); 
    int r = rand() % 10; 

    printf("In child %d\n", getpid()); 
    sleep(r); 

    exit(r); 
} 

выходной ток: Пара вещей, которые я заметил это "Ребенок мертв ..." выход все возвращаются в то же самое время. Когда они, безусловно, будут отличаться.

[email protected]:~/USP_ASG2$ ./q2 
Enter an integer: 3 
In child 15624 
In child 15623 
In child 15622 
Child 15624 is dead with exit status 0 
Child 15624 is dead with exit status 0 
Child 15624 is dead with exit status 0 
+0

'статус' неинициализирован. Вам нужно передать указатель на него в 'wait'. – kaylum

+0

1) Прочтите страницу руководства для 'wait'. 2) Прибыль. – user3386109

+0

предложите использовать waitpid(), чтобы вы знали, какой ребенок вышел из него. – user3629249

ответ

0

предлагаю использовать waitpid(), чтобы вы знали, какой ребенок вышел из него.

функция fork() возвращает идентификатор процесса ребенка к родителю (прочитать справочную страницу для fork())

Для получения/использование статуса выхода ребенка, wait() или waitpid() имеет параметр, который является указателем на INT переменного ,

Когда wait() или waitpid() возвращается к своему «вызывающему», переменная int будет содержать статус выхода из дочернего элемента.

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