Fork (programmazione): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
MiGz (discussione | contributi)
m Corretta intro
Messbot (discussione | contributi)
Riga 2:
Una '''fork''' in [[Programmazione (informatica)|programmazione]] è la modalità attraverso cui un [[Processo (informatica)|processo]] crea in [[memoria (informatica)|memoria]] una copia di se stesso: la copia prenderà il nome di [[processo figlio]], mentre il processo originale verrà chiamato [[processo padre]].
 
Nei [[Sistema operativo|sistemi operativi]] [[UNIX]] e [[Unix-like]] il processo padre ed il processo figlio possono scegliere le istruzioni da eseguire tramite il [[Funzione (informatica)#Valore restituito|valore di ritorno]] della [[chiamata di sistema]] <ttkbd>fork()</ttkbd>. Il valore di ritorno della chiamata <ttkbd>fork()</ttkbd> vale 0 nel processo figlio, un numero maggiore di 0 nel processo padre (il valore restituito è proprio il [[PID (Unix)|PID]] del figlio) o un valore minore di 0 nel caso in cui non sia stato possibile creare un nuovo processo (ad esempio per un eccessivo numero di processi attualmente attivi).
 
Quando un processo effettua la chiamata <ttkbd>fork()</ttkbd> verrà creato un nuovo spazio di indirizzamento. Comunque, con tecniche di [[copy-on-write]] non verrà occupata memoria fisica fino al momento in cui uno dei due processi non effettuerà una scrittura. Il processo figlio avrà una copia esatta di tutti i segmenti di memoria del processo padre. Sia il processo padre che il figlio possono proseguire la loro esecuzione indipendentemente l'uno dall'altro.
 
== Importanza della fork() in Unix ==
 
La <ttkbd>fork()</ttkbd> è una parte importante di Unix, critica per il supporto della sua filosofia di progettazione, la quale incoraggia lo sviluppo di [[Filtro (Unix)|filtri]]. In Unix, un filtro è un piccolo programma che legge il suo input dallo [[standard input]], e scrive il suo output nello [[standard output]]. Una [[Pipeline (Unix)|pipeline]] di questi comandi può essere concatenata insieme da una [[Shell (informatica)|shell]] per creare nuovi comandi. Per esempio, è possibile legare insieme l'output del comando [[Find (Unix)|find]] e l'input del comando [[Wc (Unix)|wc]] per creare un nuovo comando che stamperà il numero di file che terminano con ".cpp" trovati nella directory corrente, secondo quanto segue:
 
<pre><nowiki>
Riga 14:
</nowiki></pre>
 
Per fare ciò la shell effettua una <ttkbd>fork()</ttkbd> di sé stessa, e usa la pipeline per agganciare l'output del comando find all'input del comando wc. Vengono creati due processi figli, uno per ogni comando (find e wc). Questi processi figli vengono ricoperti con il codice associato ai programmi che intendono eseguire, grazie alla famiglia di chiamate di sistema [[Exec (Unix)|exec]].
 
Più in generale, una <ttkbd>fork()</ttkbd> viene eseguita dalla shell ogni qualvolta un utente immette un comando.
 
== Esempio ==