Fork (programmazione): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
wikificata, + voci correlate, + collegamenti esterni, + template da tradurre
completata la traduzione dall'inglese
Riga 1:
{{S|informatica}}
Una '''fork''' in [[Programmazione (informatica)|programmazione]] è la modalità attraverso cui un [[Processo (informatica)|processo]] crea in memoria una copia di sé stesso,: la copia prenderà il nome di [[processo figlio]], mentre il processo originale verrà chiamato [[processo padre]]. Più in generale, una fork in un ambiente [[multithreading]] significa che un [[thread]] di esecuzione è stato duplicato.
{{T|argomento=informatica|data=ottobre 2007|lingua=inglese}}
Una '''fork''' in [[Programmazione (informatica)|programmazione]] è la modalità attraverso cui un [[Processo (informatica)|processo]] crea in memoria una copia di sé stesso, la copia prenderà il nome di [[processo figlio]], mentre il processo originale verrà chiamato [[processo padre]]. Più in generale, una fork in un ambiente [[multithreading]] significa che un [[thread]] di esecuzione è stato duplicato.
 
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]] <tt>fork()</tt>. Il valore di ritorno della chiamata <tt>fork()</tt> vale 0 nel processo figlio, un numero maggiore di 0 nel processo padre (il valore ritornato è proprio il [[PID (Unix)|PID]] del figlio) eo 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 <tt>fork()</tt> 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 ==
<!--
== Importance of Fork In Unix ==
 
ForkingLa is<tt>fork()</tt> anè importantuna partparte ofimportante di Unix, criticalcritica per toil thesupporto supportdella ofsua itsfilosofia designdi philosophyprogettazione, whichla encouragesquale theincoraggia developmentlo ofsviluppo di [[Filter_Filtro (Unix) | filtersfiltri]]. In Unix, aun filterfiltro isè aun smallpiccolo programprogramma thatche readslegge itsil suo input fromdallo stdin[[standard input]], ande writesscrive itsil suo output tonello stdout[[standard output]]. AUna [[Pipeline (Unix)|pipeline]] ofdi thesequesti commandscomandi canpuò beessere strungconcatenata togetherinsieme byda auna [[Unix_shellShell (informatica)| shell]] toper createcreare newnuovi commandscomandi. ForPer exampleesempio, oneè canpossibile stringlegare together theinsieme l'output ofdel thecomando [[Find find(1Unix)|find]] command and thee l'input ofdel thecomando [[Wc wc(1Unix)|wc]] command to createper acreare newun commandnuovo thatcomando willche printstamperà ail countnumero ofdi files endingche interminano con ".cpp" foundtrovati in the currentnella directory corrente, assecondo follows:quanto segue:
 
<pre><nowiki>
$ find . -name "*.cpp" -print | wc -l
</nowiki></pre>
 
Per fare ciò la shell effettua una <tt>fork()</tt> di se 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(2)|exec]].
In order to accomplish this, the shell forks itself, and uses [[Pipeline_(Unix) | pipes]], a form of [[interprocess communication]], to tie the output of the find command to the input of the wc command. Two child processes are created, one for each command (find and wc). These child processes are [[Overlay_(operating_system) | overlaid]] with the code associated with the programs they are intended to execute, using the exec(3) family of system calls (in the above example, find will overlay the first child process, and wc will overlay the second child process, and the shell will use pipes to tie the output of find with the input of wc).
 
Più in generale, una <tt>fork()</tt> viene eseguita dalla shell ogni qualvolta un utente immette un comando.
 
More generally, forking is also performed by the shell each time a user issues a command. A child process is created by forking the shell, and the child process is overlaid, once again by exec, with the code associated with the program to be executed.
-->
== Esempio ==
Questo è un esempio in [[Linguaggio C]] che illustra l'idea del forking in ambiente Unix-like: