2015-04-17 1 views
1

У меня есть этот код:Проверка выхода коды двух процессов

pid_t pid1 = fork(); 

    if (pid1 == 0) 
    { 
    //do some stuff 
    if (something) 
     exit(0); 
    else 
     exit(1); 
    } 
    else if (pid1 == -1) 
    printf("error\n"); 

    pid_t pid2 = fork(); 

    if (pid2 == 0) 
    { 
    //do some stuff 
    if (something) 
     exit(0); 
    else 
     exit(1); 
    } 
    else if (pid2 == -1) 
    printf("error\n"); 

//here I want to check both exit codes 

Дочерние процессы будут работать параллельно. Мне нужно проверить оба кода выхода, являются ли они 1 или 0. Я думал, что я мог бы использовать что-то вроде этого:

pid_t pid; 
int status; 
while((pid = wait(&status)) > 0) 
    printf("%d exit code: %d\n", pid, WEXITSTATUS(status)); 

Я новичок в программировании параллельно, так что я не уверен, что это правильное решение. Разве не существует возможности выхода одного из дочерних процессов до того, как родительский процесс достигнет цикла, поэтому он не получит код выхода?

+1

И в чем проблема с вашим кодом? Что происходит, когда вы запускаете его? –

ответ

2

Если один или оба из дочерних процессов выхода перед родительской сначала вызывает wait(), то операционная система будет содержать код выхода и/или причины для прекращения до тех пор, родитель не достигнет wait(). Это именно то, что «зомбический процесс».

+0

Спасибо, это ответ, который я искал. – sykatch

0

Смотрите здесь: http://linux.die.net/man/2/wait

wait() будет блокировать до тех пор, один из двух процессов не заканчивается, и возвращает информацию об этом процессе. Вы можете позвонить по телефону wait(), пока не будет больше детей, или используйте waitpid, чтобы получить информацию о конкретных PID.

Чтобы ответить на ваш вопрос - ваш код выглядит хорошо. wait() заботится о состоянии гонки для вас, так как он блокирует выполнение, пока один из детей не выйдет (или не остановлен другим способом).

2

Если процесс завершается до того, как родительский процесс достигнет wait(), он станет процессом defunct (или zombie). Это нормально, потому что если функция wait вызывается позже, она получит этот код выхода, и процесс зомби будет успешно завершен.

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

pid_t waitpid(pid_t pid, int *status, int options);

Системный вызов ожидания() приостанавливает выполнение вызывающего процесса до один из его детей заканчивается. Ожидание вызова (& статус) эквивалентно к:

waitpid(-1, &status, 0);

системный вызов waitpid() приостанавливает выполнение вызывающего процесса , пока ребенок указанный PID аргумент изменилось состояние. По умолчанию waitpid() ждет только для завершенных дочерних элементов, но это поведение может быть изменено с помощью аргумента options, как описано ниже. Значение PID может быть:

< -1

означает ожидание любого дочернего процесса, чей идентификатор группы процесса равен абсолютное значение ПИД-регулятора.

-1

означает ожидание любого дочернего процесса.

0

означает ожидание любого дочернего процесса, чей идентификатор группы равен , что вызывающего процесса.

> 0

означает ожидание ребенка, чей идентификатор процесса равен значению ВЗОМТ.

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

  • Нет связанных вопросов^_^