bionic (2) fork.2.gz

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