Fork (programmazione)

La funzione fork fa parte delle chiamate di sistema UNIX standard ( standard POSIX ). Questa funzione permette ad un processo (un programma in esecuzione) di dare vita ad un nuovo processo che ne è la copia carbone, ad esempio al fine di effettuare una seconda lavorazione in parallelo alla prima. Un buon modo per visualizzare l'effetto di una forcella su un processo è immaginare la divisione cellulare .

C'è parentela nei processi: il creatore di un nuovo processo è chiamato il padre e il nuovo processo è chiamato il figlio. La maggior parte degli attributi di sistema del genitore (ad esempio i diritti del file system) vengono passati al figlio, allo stesso modo dell'ereditarietà . Quando si avvia un sistema Unix, esiste un solo processo (numero 1). Tutti gli altri processi che possono verificarsi durante la vita del sistema discendono da questo primo processo, chiamato inittramite chiamate di sistema quali fork, vfork, posix_spawno altri mezzi. Sui primi UNIX, solo la chiamata di sistema forkconsente di creare nuovi processi.

Operazione

La chiamata di sistema fork fornisce un valore di risultato che è intero. Per identificare il padre del bambino appena creato, basta guardare il valore di ritorno di fork (). Questo può essere il PID del bambino, nel qual caso siamo nel processo genitore, o 0 nel qual caso siamo nel processo figlio. Il fork () può anche restituire il valore -1, che indica un errore durante l'esecuzione del comando.

Per ottenere il numero di processo, basta effettuare la chiamata di sistema getpid () o getppid () per ottenere il numero genitore.

Interazioni tra processi

È possibile interagire tra i processi in molti modi diversi. Innanzitutto, possiamo inviare segnali. Nel linguaggio dei comandi kill <pid> permette di uccidere il processo avendo per pid quello che si immette nel comando.

È possibile far aspettare un processo usando sleep (n) per bloccare il processo per n secondi, o usando pause () che si blocca finché non viene ricevuto un segnale.

Per terminare un processo, possiamo usare exit (state) sapendo che lo stato è un codice finale, per convenzione 0 se ok, altrimenti codice di errore.

Può essere molto pratico per il padre aspettare la fine di uno dei suoi figli , per fare questo usiamo pid_t wait (int * ptr_etat) che dà come valore di ritorno il pid del bambino che ha finito, e il codice finale è archiviato in ptr_etat.

Possiamo anche aspettare la fine del bambino grazie al suo pid  : pid_t waitpid (pid_t pid, int * ptr_etat, int opzioni).

Un termine comune nella parte "Sistema" dell'informatica è quello che viene chiamato processi zombie . Ciò accade quando il processo è completo ma il padre non ha aspettato suo figlio, ovvero non ha chiamato wait () . Questa è una situazione che dovrebbe essere assolutamente evitata perché il processo non può più essere eseguito ma consuma comunque risorse.

Uso e alternativa

Ogni processo su un fork ha il proprio spazio di indirizzi, che è costoso da duplicare, anche con trucchi come il copy-on-write . A volte vale la pena sostituire le fork con thread (processi leggeri) che condividono lo stesso spazio di memoria ... a rischio e pericolo del programmatore, tuttavia.

La funzione fork è ampiamente utilizzata nelle applicazioni client-server con più client simultanei.

Note e riferimenti

  1. (in) "  Libreria interfaccia POSIX: liboskit_posix.a  "
  2. POSIX , fork - crea un nuovo processo
  3. POSIX , vfork - crea un nuovo processo; condividere la memoria virtuale
  4. POSIX , posix_spawn, posix_spawnp - genera un processo
  5. DM Ritchie e K. Thompson, The UNIX Time-Sharing System , pagine 7 e 8
  6. DM Ritchie e K. Thompson, UNIX Manual version 1, fork - spawn new process

Articoli Correlati