bionic (2) vfork.2.gz

Provided by: manpages-it_3.73-2_all bug

NOME

       vfork - crea un processo figlio e blocca il genitore

SINTASSI

       #include <sys/types.h>
       #include <unistd.h>

       pid_t vfork(void);

   Macro per test di funzionalità per glibc (vedere feature_test_macros(7)):

       vfork():
           Since glibc 2.12:
               _BSD_SOURCE ||
                   (_XOPEN_SOURCE >= 500 ||
                       _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
                   !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)
           Before glibc 2.12:
               _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

DESCRIZIONE

   Descrizione standard
       (Da  POSIX.1) 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 genitore.  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 thread viene sospeso finché  il  figlio  non  termina  (sia
       normalmente,  chiamando  _exit(2), che in modo anormale, dopo aver consegnato un segnale fatal), o finchè
       non esegue una chiamata a execve(2).  Fino a quel punto, il figlio condivide la memoria con il  genitore,
       incluso  lo stack.  Il figlio non deve tornare dalla funzione attuale o chiamare exit(3), ma può chiamare
       _exit(2).

       Come in fork(2), il processo figlio creato da vfork() eredita copie di diversi attributi del processo del
       chiamante  (per  esempio, descrittori di file, definizioni di segnale e la directory di lavoro corrente);
       la chiamata vfork() differisce solo nel trattamento dello spazio degli  indirizzi  virtuali,  come  sopra
       descritto.

       I  segnali  inviati  al  genitore arrivano dopo che il figlio ha rilasciato la memoria del genitore (cioé
       dopo che il figlio termina o chiama execve(2)).

   Descrizione storica
       Sotto Linux, fork(2) è implementato usando pagine 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 genitore, 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 genitore, ma
       prendeva la memoria del genitore e il thread di controllo fino a una chiamata a execve(2) o un exit.   Il
       processo  genitore  era  sospeso  mentre  il  figlio  utilizzava  le  sue  risorse.  L'uso di vfork() era
       complicato: per esempio, la non modifica dei dati  nel  processo  genitore  dipendeva  dal  sapere  quali
       variabili erano conservate in un registro.

CONFORME A

       4.3BSD;  POSIX.1-2001  (ma  segnato  come  OBSOLETO).  POSIX.1-2008 rimuove le specifiche per vfork().  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 genitore rimanga bloccato fino al termine del figlio o finché chiama  execve(2),  e  non
       può contare su alcuno specifico comportamento riferendosi alla memoria condivisa.

NOTE

       Alcuni  considerano  la semantica di vfork() come un difetto dell'architettura, e la pagina di manuale di
       4.2BSD dichiarava: "Questa chiamata di sistema verrà  eliminata  quando  saranno  implementati  opportuni
       meccanismi  di  condivisione.   Gli utenti non dovrebbero dipendere dalla semantica di condivisione della
       memoria di vfork() poiché, in questo caso, diventerebbe sinonimo di  fork(2)."   Comunque,  anche  se  il
       moderno  hardware  per  la gestione della memoria ha ridotto la differenza fra fork(2) e vfork(), ci sono
       diverse ragioni per le quali Linux e altri sistemi hanno mantenuto vfork():

       *  Alcune applicazioni per cui le prestazioni sono un punto critico richiedono il  piccolo  vantaggio  in
          termini di prestazioni garantito da vfork().

       *  vfork()  può  essere implementato su sistemi mancanti di un'unità di gestione della memoria (MMU), sui
          quali però fork(2) non può essere implementato.  (POSIX.1-2008  ha  rimosso  vfork()  dallo  standard;
          nelle  motivazioni  di  POSIX per la funzione posix_spawn(3) si nota che questa funzione, che fornisce
          una funzionalità equivalente a fork(2)+exec(3), è progettata  per  essere  implementabile  su  sistemi
          mancanti di MMU).

   Note Linux
       I  gestori  di fork definiti 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 usa la libreria di threading LinuxThreads.  (Vedere pthreads(7) per
       una descrizione delle librerie di threading di Linux).

       Una chiamata a vfork() è equivalente a una chiamata a clone(2) con opzioni definite come:

            CLONE_VM | CLONE_VFORK | SIGCHLD

   Storia
       La chiamata di sistema vfork() è apparsa nella 3.0BSD.  Nella versione 4.4BSD  è  diventata  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

       I 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 ioctls 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)

COLOPHON

       Questa  pagina fa parte del rilascio 3.73 del progetto Linux man-pages.  Una descrizione del progetto, le
       istruzioni per la  segnalazione  degli  errori,  e  l'ultima  versione  di  questa  pagina  si  trova  su
       http://www.kernel.org/doc/man-pages/.

       La  versione  italiana  fa  parte  del  pacchetto  man-pages-it  v.  3.73, a cura di: ILDP "Italian Linux
       Documentation Project" http://www.pluto.it/ildp
       Per la traduzione in italiano si può fare riferimento a http://www.pluto.it/ildp/collaborare/
       Segnalare eventuali errori di traduzione a ildp@pluto.it