Domanda

Di solito quando ho bisogno di fare il fork di C, faccio qualcosa del genere:

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

Mi è venuto in mente che avrei potuto abbandonare la variabile aggiuntiva e usare:

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

Gestione errata degli errori a parte, (perché) funziona / non funziona?

È stato utile?

Soluzione

Quello che stai suggerendo funzionerà sicuramente. Tuttavia, la gestione degli errori non è facoltativa in nessuna applicazione ben educata. Il seguente modello di implementazione è similmente succinto e gestisce anche gli errori. Inoltre, salva il valore di ritorno fork () nella variabile pid, nel caso in cui si desideri utilizzarlo in seguito nel padre per, diciamo, attendere il figlio.

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

Altri suggerimenti

Si perde l'ID del processo figlio nel genitore, che è ciò che viene restituito al genitore. Penso che potresti recuperare quelle informazioni, ma forse non in modo univoco (cioè, penso che potresti ottenere il PID di tutti i tuoi figli, ma non necessariamente il PID del bambino che hai appena biforcato). Se non hai bisogno di conoscere il PID del bambino, penso che il secondo modo vada bene.

Inoltre, viene restituito -1 se si verifica un errore nel fork, che in entrambi i casi non si verifica, il che di solito è un errore.

Dovresti invece farlo. Non ho mai saputo che non funzionasse. È come nei libri di Stevens.

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

Sei libero di farlo in C e funzionerà perché il genitore e il figlio riceveranno valori di ritorno diversi dal fork - e viene valutato per primo. Gli unici problemi sono la gestione degli errori, come hai detto. Inoltre, non avrai altri modi per recuperare il PID figlio nel caso in cui volessi operare su di esso, ad esempio con un waitpid, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top