Provided by: manpages-it_2.80-5_all 

NOME
vfork - crea un processo figlio e blocca il padre
SINTASSI
#include <sys/types.h>
#include <unistd.h>
pid_t vfork(void);
Test delle funzioni e requisiti delle macro per glibc (vedere feature_test_macros(7)):
vfork(): _BSD_SOURCE || _XOPEN_SOURCE >= 500
DESCRIZIONE
Descrizione standard
(Dalla bozza SUSv2 / POSIX.) La funzione vfork() ha lo stesso effetto di fork(2), con l'eccezione che il
comportamento è indefinito se il processo creato da vfork() modifica un dato qualsiasi che non sia una
variabile di tipo pid_t usata per archiviare il valore restituito da vfork(), o torna dalla funzione
nella quale vfork() è stato chiamato, o chiama qualunque altra funzione prima di chiamare con successo
_exit(2) o una delle funzioni della famiglia di exec(3).
Descrizione Linux
vfork(), proprio come fork(2), crea un processo figlio del processo chiamante. Per dettagli sui valori
restituiti e sugli errori, vedere fork(2).
vfork() è un caso speciale di clone(2). Si usa per creare nuovi processi senza copiare le tabelle di
pagina del processo padre. Può essere utile in applicazioni sensibili alle prestazioni, nelle quali verrà
creato un figlio che emette immediatamente un execve(2).
vfork() è diverso da fork(2) nel senso che il padre viene sospeso finché il figlio esegue una chiamata a
execve(2) o _exit(2). Il figlio condivide la memoria con il padre, incluso lo stack, finché emette
execve(2). Il figlio non deve tornare dalla funzione attuale o chiamare exit(3), ma può chiamare
_exit(2).
I gestori del segnale vengono ereditati, ma non condivisi. I segnali al padre arrivano dopo che il figlio
ha rilasciato la memoria del padre.
Descrizione storica
Sotto Linux, fork(2) è implementato usando pagine di tipo copy-on-write, così che la sola penalizzazione
in cui incorre fork(2) è il tempo e la memoria richiesti per duplicare le tabelle delle pagine del padre,
e per creare un'unica struttura di task per il figlio. Tuttavia, anticamente fork(2) richiedeva una copia
completa dello spazio dati del chiamante, spesso senza che ce ne fosse bisogno, di solito immediatamente
dopo l'esecuzione di exec(3). Quindi, per una maggiore efficienza, BSD ha introdotto la chiamata di
sistema vfork(), che non copiava completamente lo spazio di indirizzamento del processo padre, ma
prendeva la memoria del padre e il thread di controllo fino a una chiamata a execve(2) o un exit. Il
processo padre era sospeso mentre il figlio utilizzava le sue risorse. L'uso di vfork() era complicato:
per esempio, la non modifica dei dati nel processo padre dipendeva dal sapere quali variabili erano
conservate in un registro.
CONFORME A
4.3BSD, POSIX.1-2001. I requisiti indicati per vfork() dagli standard sono più deboli di quelli indicati
per fork(2), così un'implementazione dove i due sono sinonimi è conforme. In particolare, il
programmatore non può contare sul fatto che il padre rimanga bloccato fino a una chiamata di execve(2) o
_exit(2), e non può contare su alcuno specifico comportamento riferendosi alla memoria condivisa.
NOTE
Note Linux
I gestori dei fork stabiliti usando pthread_atfork(3) non sono chiamati quando un programma multithreaded
che impiega le chiamate alla libreria di threading NPTL chiama vfork(). I gestori dei fork sono chiamati
in questo caso in un programma che usi la libreria di threading LinuxThreads. (Vedere pthreads(7) per una
descrizione delle librerie di threading di Linux).
Storia
La chiamata di sistema vfork() è apparsa nella 3.0BSD. Nella versione 4.4BSD è stata resa sinonimo di
fork(2) ma NetBSD l'ha reintrodotta, cf. http://www.netbsd.org/Documentation/kernel/vfork.html . In Linux
è stata equivalente a fork(2) fino alla versione 2.2.0-pre6. A partire dalla 2.2.0-pre9 (su i386, un po'
più tardi su altre architetture) è una chiamata di sistema indipendente. Ne è stato aggiunto il supporto
in glibc 2.0.112.
BUG
È piuttosto sfortunato che Linux abbia richiamato questo spettro dal passato. La pagina di manuale di BSD
afferma: "Questa chiamata di sistema sarà eliminata quando saranno implementati meccanismi appropriati di
condivisione di sistema. Gli utenti non devono dipendere dalla semantica della condivisione di memoria di
vfork() poiché sarebbe, in questo caso, resa sinonimo di fork(2)."
Dettagli sulla gestione del segnale sono oscuri e diversi da sistema a sistema. La pagina di manuale di
BSD afferma: "Per evitare una possibile situazione di stallo, ai processi che sono figli nel mezzo di un
vfork() non vengono mai inviati segnali SIGTTOU o SIGTTIN ; invece, output o ioctl sono permessi e i
tentativi di input danno come risultato un'indicazione di fine file."
VEDERE ANCHE
clone(2), execve(2), fork(2), unshare(2), wait(2)
Linux 26 luglio 2007 VFORK(2)