Pergunta

Normalmente, quando eu preciso garfo em C, eu fazer algo parecido com isto:

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

Ocorreu-me que eu poderia abandonar a variável extra e uso:

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

erro inadequada manipulação de lado, (porque) faz este trabalho / não trabalho?

Foi útil?

Solução

O que você está sugerindo, certamente trabalhar. No entanto, manipulação de erro não é opcional em qualquer aplicação bem-comportado. O padrão de execução seguinte é igualmente sucinta e também lida com erros. Além disso, ele salva o fork () valor de retorno na variável pid, no caso de você querer usá-lo mais tarde no pai para, digamos, espera para a criança.

switch (pid = fork()) {
case -1:       /* Failure */
  /* ... */
case 0:        /* Child */
  /* ... */
default:       /* Parent */
  /* ... */
}

Outras dicas

Você perde o ID processo filho no pai, que é o que é devolvido ao pai. Eu acho que você poderia recuperar essa informação, mas talvez não de forma única (isto é, eu acho que você poderia obter o PID de todos os seus filhos, mas não necessariamente o PID da criança você apenas bifurcada). Se você não precisa saber PID da criança, acho que a segunda maneira é bom.

Além disso, -1 é retornado se há um erro na bifurcação, que você não está testando em ambos os casos, que normalmente é um erro.

Você deve fazer isso em seu lugar. Eu nunca soube que ele não funciona. É assim que se faz nos livros Stevens.

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

Você é livre para fazer isso em C e irá funcionar porque o pai ea criança receberá diferentes valores de retorno do garfo - e é avaliada primeiro. As únicas questões são o tratamento de erros, como você mencionou. Além disso, você não terá qualquer outra forma de recuperar a criança PID no caso de você queria operá-lo, como com um waitpid, etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top