Stavo cercando di trovare la differenza tra questi quattro su Google e mi aspettavo che ci fosse un'enorme quantità di informazioni su questo, ma in realtà non c'era nessun solido confronto tra le quattro chiamate.
Ho iniziato a provare a compilare una sorta di sguardo d'insieme sulle differenze tra queste chiamate di sistema ed ecco cosa ho ottenuto. Tutte queste informazioni sono corrette / mi sto perdendo qualcosa di importante?
Fork
: La chiamata fork sostanzialmente fa un duplicato del processo corrente, identico in quasi tutti i modi (non tutto viene copiato, ad esempio, i limiti di risorse in alcune implementazioni, ma l'idea è quella di creare una copia il più vicino possibile).
Il nuovo processo (figlio) ottiene un diverso ID processo (PID) e ha il PID del vecchio processo (padre) come PID padre (PPID). Poiché ora i due processi eseguono esattamente lo stesso codice, possono stabilire quale sia il codice di ritorno del fork: il figlio ottiene 0, il genitore ottiene il PID del figlio. Tutto questo, ovviamente, presupponendo che la chiamata fork funzioni - in caso contrario, non viene creato alcun figlio e il genitore riceve un codice di errore.
Vfork
: La differenza di base tra vfork e fork è che quando viene creato un nuovo processo con vfork (), il processo parent viene temporaneamente sospeso e il processo child potrebbe prendere in prestito lo spazio degli indirizzi del parent. Questo strano stato di cose continua fino a quando non termina il processo figlio o chiama execve (), a quel punto il processo genitore continua.
Ciò significa che il processo figlio di un vfork () deve fare attenzione per evitare di modificare in modo imprevisto le variabili del processo genitore. In particolare, il processo figlio non deve tornare dalla funzione contenente la chiamata vfork () e non deve chiamare exit () (se deve uscire, dovrebbe usare _exit (); in realtà, questo vale anche per il figlio di una forcella normale ()).
Exec :
La chiamata exec è un modo per sostituire sostanzialmente l'intero processo corrente con un nuovo programma. Carica il programma nello spazio del processo corrente e lo esegue dal punto di ingresso. exec () sostituisce il processo corrente con un eseguibile indicato dalla funzione. Il controllo non ritorna mai al programma originale a meno che non ci sia un errore exec ().
Clone :
Il clone, come fork, crea un nuovo processo. A differenza del fork, queste chiamate consentono al processo figlio di condividere parti del suo contesto di esecuzione con il processo chiamante, come lo spazio di memoria, la tabella dei descrittori di file e la tabella dei gestori di segnale.
Quando il processo figlio viene creato con clone, esegue la funzione application fn (arg). (Differisce dal fork, dove l'esecuzione continua nel child dal punto della chiamata fork originale.) L'argomento fn è un puntatore a una funzione chiamata dal processo child all'inizio della sua esecuzione. L'argomento arg viene passato alla funzione fn.
Quando ritorna l'applicazione della funzione fn (arg), il processo figlio termina. Il numero intero restituito da fn è il codice di uscita per il processo figlio. Il processo figlio può anche terminare esplicitamente chiamando exit (2) o dopo aver ricevuto un segnale fatale.
Modulo di informazione ottenuta:
- Differenze tra fork e exec
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
Grazie per aver dedicato del tempo a leggere questo! :)
fork()
, che è in Linux, e probabilmente tutti i BSD) prendendo in prestito lo spazio degli indirizzi dei suoi genitori. Tutto ciò che fa, oltre a chiamare execve()
o _exit()
, ha un grande potenziale per confondere il genitore. In particolare, exit()
chiama i atexit()
gestori e altri "finalizzatori", ad esempio: elimina i flussi stdio. Il ritorno da un vfork()
bambino potrebbe potenzialmente (stessa avvertenza di prima) rovinare lo stack del genitore.
fork
syscall?