fork
Effettua una chiamata di sistema a fork(2), al fine di creare un nuovo
processo che esegua lo stesso programma a partire dal punto della chiamata.
Restituisce il pid del figlio al processo genitore, 0 al processo figlio,
oppure undef se la chiamata non ha successo. I descrittori dei file (ed
a volte anche i lock su tali descrittori) vengono condivisi, mentre tutto
il resto viene copiato. Sulla maggior parte dei sistemi che supportano
fork(), l'efficienze è stata molto curata (per esempio, usando la
tecnologia copy-on-write [copia-su-scrittura, NdT] sulle pagine dati),
facendo di essa il paradigma dominante per il multitasking negli ultimi
decenni.
A partire dalla versione 5.6.0, Perl cercherà di completare le
operazioni di scrittura su tutti i file aperti in output prima di effettuare
il fork del processo figlio, ma ciò potrebbe non essere supportato
su alcuni sistemi (consultate perlport). Per essere sicuri, potreste
dover impostare $| ($AUTOFLUSH con il modulo English) o chiamare il
metodo autoflush() di IO::Handle sugli eventuali handle aperti,
così da evitare un output duplicato.
Se utilizzate fork senza mai attendere i vostri figli, accumulerete
zombie. Su alcuni sistemi, potete evitare ciò impostando
$SIG{CHLD} a "IGNORE". Consultate anche perlipc per ulteriori
esempi su fork e su come liberarsi dei figli moribondi.
Va notato che se il figlio che avrete creato con fork eredita dei
descrittori di file di sistema come STDIN e STDOUT che sono in
realtà connessi da una pipe o un socket, anche se uscite, il
server remoto (come, ad esempio, uno script CGI o un processo in
background lanciato da una shell remota) non si accorgeranno che voi
avete finito. Se ciò rappresenta un problema, dovrete riaprire
tali descrittori verso /dev/null.