indietro

  • 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.