2013-12-15 6 views
0

Существуют ли 3 дочерних процесса и один родительский процесс? Что делают два разных waitpid, и почему их два?Использование вилов с waitpid

int main() 
{ 
    pid_t pid; 

    int status, counter = 4; 
    while(counter > 0) 
    { 
     pid = fork(); 
     if(pid) 
     { 
      counter /= 2; 
     } 
     else 
     { 
      printf("%d", counter); /* (1) */ 
      break; 
     } 
    } 
    if(pid) 
    { 
     waitpid(-1, &status, 0); 
     counter += WEXITSTATUS(status); 
     waitpid(-1, &status, 0); 
     counter += WEXITSTATUS(status); 
     printf(";%d", counter); /* (2) */ 
    } 
    return counter; 
} 

второй Printf после waitpid отпечатков 3, 5, 6, 34, 52, 61 (за исключением точки с запятой). Я не уверен, как печатаются две цифры. Я знаю, что вторая цифра, вероятно, поступает из printf в цикле while.

+0

Поместите префикс перед 'printf' в цикле while, чтобы вы могли узнать, где он начинается. – Barmar

+1

Обратите внимание, что некоторые дети также будут вилкой. – egur

+2

@egur как так? 'fork()' вызывается только в куске кода, который требует 'counter> 0' после fork, дочерний элемент (с' pid == 0') выходит из цикла, который выполняет 'fork()'. – mah

ответ

1

Да, есть 3 дочерних процесса и 1 родитель. Дети возвращают 4, 2, 1.

Чтобы собрать все статусы, вы можете использовать время цикла:

if(pid) 
{ 
    while (waitpid(-1, &status, 0) != -1) /* ignoring signals, errors */ 
    counter += WEXITSTATUS(status); 
} 
return counter; 

Parent возвращает 7 в этом случае.

Если вы используете только два waitpid() вызовов, то они могут вернуть любую пару из {4,2,1} набора, например, {4,1} или {2,1} так родительские отпечатков ;5 и ;3 соответственно.

Из-за буферизации stdio и взаимодействия fork() выход может размножаться. См. printf anomaly after “fork()”

Либо fflush() до fork(), либо используйте write/_exit у детей вместо этого.

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

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