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)