2016-11-20 3 views
1

Чтобы узнать, работает ли wait(), будет ли правильным проверить его следующим образом? Теоретически, если wait() не терпит неудачу, следует вернуть родительскому процессу законченный дочерний pid, иначе родительский pid будет равен 1, правильно?Проверка ошибки wait()

switch (process = fork()) 
{ 
    case -1: 
     // Fork fail 
     perror("Fork failed"); 
     exit(EXIT_FAILURE); 

    case 0: 
     //Child process 
     HERE CODE DOES SOMETHING 
     exit(EXIT_SUCCESS); 
    default: 
     //Parent process 
     pid=wait(&status); 

     if(pid==1){ 
      perror("Wait failed"); 
     }else{ 
     exit(EXIT_SUCCESS); 
     } 
} 
+1

Чтение документации функцию, в основном помогает: http://man7.org/linux/man-pages/man2/waitpid.2 .html – alk

+1

Кроме того, что 'wait' возвращает -1, а не 1 в случае ошибки, которая была покрыта существующими ответами, рассмотрите использование' waitpid', чтобы убедиться, что вы ожидаете процесс, который вы только раздвоили, а не первый дочерний процесс, который происходит с выходом (возможно, разветвлено раньше или другим потоком). Кроме того, рекомендуется использовать '_exit' вместо' exit', чтобы предотвратить непреднамеренное стирание буферов stdip родителя, унаследованных дочерним процессом. – user4815162342

+1

@ пользователь4815162342 спасибо. – krm

ответ

5

Цитирование man 2 wait:

ВОЗВРАТ СТОИМОСТИ

ожидания(): в случае успеха возвращает идентификатор процесса прерванного ребенка; погрешность, -1.

Так, чтобы проверить, если wait(2) не удалось, это должно быть достаточно:

if (wait(&status) == -1) { 
    perror("wait failed"); 
    exit(1); 
} 
+0

Лучше используйте этот http://man7.org/linux/man-pages/man2/waitpid.2.html для справки. Это более точно, более up-tp-date и менее spamed. – alk

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