2014-11-18 2 views
0

Я пытаюсь использовать дочерние процессы при использовании fork() для параллельной работы двух команд. Я делаю это с помощью следующего кода:Воспроизведение дочерних процессов при использовании fork()

int process() { 
    int w, status; 
    while ((w = waitpid(-1,&status,WNOHANG)) > 0)        
     fprintf(stderr,"Completed: %d (%d)\n",w,status); 

    int pid;                 
    if ((pid = fork()) < 0)             
     errorExit (EXIT_FAILURE);           

    if (pid == 0) {               
     // run first command            
    } else if (cmdList->right) {            
     // run second command           
    } 
} 

Мое понимание этого кода, как это: Я бегу waitpid() непрерывно thorughout во время выполнения программы и всякий раз, когда waitpid() возвращает значение больше 0, то сообщает об этом (тем самым позволяя зомби умереть), а затем выполняет fprintf() до stderr. Является ли это понимание неправильным?

+0

Цикл 'while' очистит всех мертвых детей до развилки (не дожидаясь, если таких детей нет). Возможно, вам понадобится сделать еще один подобный цикл в родительском процессе после fork. Немного тревожит, что 'w' и' status' являются глобальными переменными. –

ответ

0

Этот код будет убедиться, что все прекращенные дети будут удалены, так как флаг предлагает:

WNOHANG

waitpid() функция не приостанавливает выполнение вызывающего потока, если состояние не сразу доступный для одного из дочерних процессов, заданных pid.

Ref

Так что пока вы встречаете такого рода детей, вы будете выполнять fprintf(). Поэтому, если у вас есть двое из этих детей, fprintf() будет выполнен дважды. fprintf() будет писать до stderr.

Обратите внимание, что после этого цикла вы вызываете fork() еще раз, что создаст дочерний элемент, который не будет обрабатываться циклом.