PTHREAD_ATFORK(3)                               PTHREAD_ATFORK(3)

       pthread_atfork - register handlers to be called at fork(2)

       #include <pthread.h>

       int  pthread_atfork(void  (*prepare)(void),  void   (*par-
       ent)(void), void (*child)(void));

       pthread_atfork  registers  handler  functions to be called
       just before and just after a new process is  created  with
       fork(2).  The prepare handler will be called from the par-
       ent process, just before the new process is  created.  The
       parent  handler  will  be  called from the parent process,
       just before fork(2) returns. The  child  handler  will  be
       called   from  the  child  process,  just  before  fork(2)

       One or several of the three handlers prepare,  parent  and
       child  can be given as NULL, meaning that no handler needs
       to be called at the corresponding point.

       pthread_atfork can be called several times to install sev-
       eral  sets  of handlers. At fork(2) time, the prepare han-
       dlers  are  called  in  LIFO  order   (last   added   with
       pthread_atfork,  first called before fork), while the par-
       ent and child handlers are called  in  FIFO  order  (first
       added, first called).

       To  understand  the purpose of pthread_atfork, recall that
       fork(2)  duplicates  the  whole  memory  space,  including
       mutexes in their current locking state, but only the call-
       ing thread: other threads are not  running  in  the  child
       process. Thus, if a mutex is locked by a thread other than
       the thread calling fork, that  mutex  will  remain  locked
       forever in the child process, possibly blocking the execu-
       tion of the child process. To avoid this, install handlers
       with  pthread_atfork as follows: the prepare handler locks
       the global mutexes (in locking order), and the parent  and
       child  handlers  unlock  them (in reverse order). Alterna-
       tively, prepare and parent can be set to NULL and child to
       a  function  that  calls  pthread_mutex_init on the global

       pthread_atfork returns 0 on success and a  non-zero  error
       code on error.

       ENOMEM insufficient  memory available to register the han-

       Xavier Leroy <>

       fork(2), pthread_mutex_lock(3), pthread_mutex_unlock(3).

                           LinuxThreads                         1