Scroll to navigation

VFORK(2) Linux Programmer's Manual VFORK(2)

NOME

vfork - crea un processo figlio e blocca il genitore

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

(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 genitore viene sospeso finché il figlio termina (sia normalmente, chiamando exit(2), che in modo anormale, dopo aver consegnato un segnale fatal), o finchè 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).

I gestori del segnale vengono ereditati, ma non condivisi. I segnali 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. 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

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 è 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

È 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 R ioctl s 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.13 del progetto man-pages di Linux. Si può trovare una descrizione del progetto, e informazioni su come riportare bachi, presso http://www.kernel.org/doc/man-pages/. Per la traduzione in italiano si può fare riferimento a http://www.pluto.it/ildp/collaborare/

30 ottobre 2008 Linux