Provided by: manpages-it_2.80-5_all bug

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)