/ / Restituisce un valore dal processo figlio al suo genitore in C creato con fork () - c, concorrenza, fork

Restituisce un valore dal processo figlio al suo genitore in C creato con fork () - c, concorrenza, fork

Imparare a biforcarsi con C.

Posso generare un processo figlio con fork() tutto apposto. Supponiamo che esegua alcuni calcoli. Al termine del calcolo, mi piacerebbe che morisse e restituisse il risultato (alcuni int) al genitore. Come si può fare?

Normalmente avrei inserito il codice dei miei progressi, ma è letteralmente:

int main () {
pid_t  pid = fork();
if (pid == 0) {
// I"m a child!
int calculation = 10 + 10;
// <----- Return 20 to the parent?
}else{
// I am the parent, and I am waiting to receive a 20
}
exit(0);
}

risposte:

1 per risposta № 1

Non puoi farlo, perché exit fornisce solo un codice di uscita (che dovrebbe essere convenzionalmente EXIT_SUCCESS in caso di successo e ha solo 7 bit). E il codice di uscita è l'unica cosa che restituisce un processo (vedi waitpid (2), che dovresti sempre chiamare per evitare processi zombi).

Puoi fare in modo che i processi genitore e figlio utilizzino un po 'di memoria condivisa e semafori (vedi shm_overview (7) & sem_overview (7)), ma questo è complesso, quindi è inappropriato per il tuo caso.

Il modo più semplice, e probabilmente più veloce, è solo quello di usarlo tubo (7)-s (da configurare prima fork) e avere il processo figlio stampato su di esso stdout alla pipe e al processo genitore letto sulla pipe. Vedere tubo (2) e anche popen (3).

Potresti volere fork parecchi (al massimo una dozzina su un desktop) elabora in parallelo. Quindi dovrai multiplexare i loro input di pipe. Per questo, usa un loop di eventi e usalo sondaggio (2) nel processo genitore per il multiplexing.

Leggi anche Programmazione Linux avanzata


1 per risposta № 2

Oltre a pipe e fork, il metodo più semplice è usare popen () e leggere la risposta del bambino su stdout come flusso FILE.

Non devi assolutamente occuparti di fork. (Anche se effettivamente, popen è implementato su fork e pipe e dup2).

pclose () può essere utilizzato per verificare lo stato di uscita di child.