fork () в качестве аргумента - PullRequest
       10

fork () в качестве аргумента

4 голосов
/ 25 сентября 2008

Обычно, когда мне нужно раскошелиться на C, я делаю что-то вроде этого:

pid_t p = fork();
if(p == 0) { /* do child stuff */ }
else { /* do parent stuff and pray there wasn't an error */ }

Мне пришло в голову, что я могу отказаться от дополнительной переменной и использовать:

if(fork() == 0) { /* child */ }
else { /* parent/pray */ }

Неправильная обработка ошибок в стороне, (почему) это работает / не работает?

Ответы [ 4 ]

20 голосов
/ 25 сентября 2008

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

switch (pid = fork()) {
case -1:       /* Failure */
  /* ... */
case 0:        /* Child */
  /* ... */
default:       /* Parent */
  /* ... */
}
4 голосов
/ 25 сентября 2008

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

Кроме того, -1 возвращается в случае ошибки при разветвлении, которую вы не проверяете ни в одном из случаев, что обычно является ошибкой.

2 голосов
/ 25 сентября 2008

Вы должны сделать это вместо этого. Я никогда не знал, что это не работает. Это то, как это делается в книгах Стивенса.

int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }
1 голос
/ 25 сентября 2008

Вы можете сделать это в C, и это сработает, потому что родительский и дочерний элементы получат разные возвращаемые значения из вилки - и это будет оценено в первую очередь Единственные проблемы - обработка ошибок, как вы упомянули. Кроме того, у вас не будет другого способа восстановить дочерний PID, если вы захотите с ним работать, например, с помощью waitpid и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...