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

NOME

       fork - crea un processo figlio

SINTASSI

       #include <unistd.h>

       pid_t fork(void);

DESCRIZIONE

       fork() crea un nuovo processo duplicando il processo chiamante. Il nuovo processo, che chiameremo figlio,
       è un esatto duplicato del processo chiamante, chiamato genitore, tranne che per i seguenti punti:

       *  Il  figlio  ha  il  suo  ID unico di processo, e questo PID non corrisponde all'ID di nessun gruppo di
          processi esistente (setpgid(2)).

       *  L'ID di processo-genitore del figlio è uguale all'ID di processo del genitore.

       *  Il figlio non eredita i blocchi di memoria del suo genitore (mlock(2), mlockall(2)).

       *  L'utilizzo delle risorse di processo (getrusage(2)) e  i  contatori  del  tempo  CPU  (times(2))  sono
          reimpostati a zero nel figlio.

       *  Il set di segnali in attesa nel figlio è inizialmente vuoto. (sigpending(2)).

       *  Il figlio non eredita le regolazioni dei semafori dal suo genitore (semop(2)).

       *  Il  figlio  non  eredita  dal genitore i blocchi sui record associati ai processi (fcntl(2)). (D'altra
          parte, esso non eredita i blocchi delle descrizioni dei file aperti fcntl(2) e i blocchi flock(2)  dal
          suo genitore.)

       *  Il figlio non eredita i temporizzatori dal genitore (setitimer(2), alarm(2), timer_create(2)).

       *  Il  figlio  non  eredita  le  operazioni  rilevanti  di  I/O  asincrono dal suo genitore (aio_read(3),
          aio_write(3)), né eredita alcun contesto di I/O asincrono dal suo genitore (vedere io_setup(2)).

       Gli attributi del processo nel precedente elenco sono  tutti  specificati  in  POSIX.1-2001.  Genitore  e
       figlio inoltre sono differenti tra loro rispetto ai seguenti attributi dei processi specifici di Linux:

       *  Il  figlio  non  eredita  le  notifiche  di  cambio  directory  (dnotify) dal suo genitore (si veda la
          descrizione di F_NOTIFY in fcntl(2)).

       *  Le impostazioni di prctl(2) PR_SET_PDEATHSIG sono azzerate in modo che il figlio non riceva un segnale
          quando il suo genitore termina.

       *  Il valore predefinito della tolleranza del temporizzatore (timer slack) è impostato al valore corrente
          della tolleranza del genitore. Si veda la descrizione di PR_SET_TIMERSLACK in prctl(2).

       *  Le mappe di memoria che sono state marcate con l'opzione madvise(2) MADV_DONTFORK non  sono  ereditate
          attraverso un fork().

       *  Il segnale di termine del figlio è sempre SIGCHLD (vedere clone(2)).

       *  I  bit dei permessi della porta di accesso impostati da ioperm(2) non vengono ereditati dal figlio; il
          figlio deve rendere attivo ogni bit che è richiesto richiesto usando ioperm(2).

       Notare i seguenti punti ulteriori:

       *  Il processo figlio è creato con un thread singolo — quello che ha chiamato fork(). L'intero spazio  di
          indirizzamento  virtuale  del  genitore è replicato nel figlio, inclusi gli stati dei mutex, variabili
          condizionali, e altri oggetti pthreads; l'uso di pthread_atfork(3) può essere di aiuto per trattare  i
          problemi che questo può causare.

       *  Il  figlio  eredita  copie del set di descrittori del file aperto del genitore. Ciascun descrittore di
          file nel figlio  fa  riferimento  alla  stessa  descrizione  di  file  aperto  (vedere  open(2))  come
          corrispondente descrittore di file nel genitore. Questo significa che i due descrittori condividono le
          opzioni di stato del file aperto, gli offset correnti del file, e gli attributi degli I/O pilotati dai
          segnali (vedere la descrizione di F_SETOWN e F_SETSIG in fcntl(2)).

       *  Il  figlio  eredita  copie  del set di descrittori della coda dei messaggi aperti del genitore (vedere
          mq_overview(7)). Ciascun descrittore nel figlio fa riferimento alla stessa descrizione della  coda  di
          messaggi  aperti  del  corrispondente descrittore nel genitore. Questo significa che i due descrittori
          condividono le stesse opzioni (mq_flags).

       *  Il figlio eredita copie del set di flussi  di  directory  aperti  dal  genitore  (vedere  opendir(3)).
          POSIX.1-2001  dice  che  i  corrispondenti  flussi  di  directory  nel  genitore  e nel figlio possono
          condividere il posizionamento dei flussi di directory; in Linux/glicb non lo fanno.

VALORE RESTITUITO

       In caso di successo il PID del processo figlio viene restituito nel genitore, e viene  restituito  0  nel
       figlio. In caso di fallimento verrà restituito -1 nel genitore, non verrà creato alcun processo figlio, e
       errno verrà impostata di conseguenza.

ERRORI

       EAGAIN fork()  non  può  allocare  memoria sufficiente per copiare le tabelle della pagina del genitore e
              allocare un struttura di task per il figlio.

       EAGAIN

              È stato raggiunto un limite imposto dal sistema sul numero di thread. Ci sono diversi  limiti  che
              possono  causare  questo  errore:  è  stato  raggiunto  il  limite delle risorse soft RLIMIT_NPROC
              (impostato con setrlimit(2)), che limita il numero di processi e di thread  per  l'ID  dell'utente
              reale;  è  stato  raggiunto  il  limite  di sistema del kernel sul numero di processi e di thread,
              /proc/sys/kernel/threads-max (vedi proc(5)); o  è  stato  raggiunto  il  mumero  massimo  di  PID,
              /proc/sys/kernel/pid_max (vedi proc(5)).

       EAGAIN Il  chiamante  sta operando sotto le regole di pianificazione dei processi SCHED_DEADLINE e non ha
              l'opzione reset-on-fork impostato. Vedi sched(7).

       ENOMEM fork() non è stato possibile allocare le strutture necessarie del kernel perché c'è poca memoria.

       ENOSYS fork() non è supportato su questa piattaforma (per esempio, hardware senza  una  Memory-Management
              Unit).

CONFORME A

       SVr4, 4.3BSD, POSIX.1-2001.

NOTE

       Sotto  Linux, fork() è implementato usando pagine copy-on-write, in modo che la sola penalità nella quale
       incorre sia il tempo e la memoria necessari per duplicare le page table del genitore, e  per  creare  una
       struttura di task unica per il figlio.

       A  partire  dalla  versione  2.3.3  il  wrapper  di  glibc fork() fornito insieme all'implementazione del
       threading di NPTL, anziché invocare la chiamata di sistema del  kernel  fork()  chiama  clone(2)  con  le
       opzioni necessarie per ottenere lo stesso risultato della chiamata di sistema tradizionale. (Una chiamata
       a  fork()  è equivalente a una chiamata a clone(2) specificando le opzioni solo come SIGCHLD.) Il wrapper
       glibc invocherà ogni gestore di fork definito usando pthread_atfork(3).

ESEMPIO

       Vedere pipe(2) e wait(2).

VEDERE ANCHE

       clone(2), execve(2), exit(2), setrlimit(2), unshare(2), vfork(2),  wait(2),  daemon(3),  capabilities(7),
       credentials(7)

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

Linux                                              2014-05-28                                            FORK(2)