Provided by: manpages-posix-dev_2.16-1_all bug

NAME

       pthread_atfork - register fork handlers

SYNOPSIS

       #include <pthread.h>

       int pthread_atfork(void (*prepare)(void), void (*parent)(void),
              void (*child)(void));

DESCRIPTION

       The  pthread_atfork()  function  shall declare fork handlers to be called before and after
       fork(), in the context of the thread that called fork(). The prepare fork handler shall be
       called  before  fork()  processing commences. The parent fork handle shall be called after
       fork() processing completes in the parent process. The child fork handler shall be  called
       after  fork() processing completes in the child process.  If no handling is desired at one
       or more of these three points, the corresponding fork handler address(es) may  be  set  to
       NULL.

       The  order of calls to pthread_atfork() is significant. The parent and child fork handlers
       shall be called in the order in which they were established by calls to  pthread_atfork().
       The prepare fork handlers shall be called in the opposite order.

RETURN VALUE

       Upon  successful  completion, pthread_atfork() shall return a value of zero; otherwise, an
       error number shall be returned to indicate the error.

ERRORS

       The pthread_atfork() function shall fail if:

       ENOMEM Insufficient table space exists to record the fork handler addresses.

       The pthread_atfork() function shall not return an error code of [EINTR].

       The following sections are informative.

EXAMPLES

       None.

APPLICATION USAGE

       None.

RATIONALE

       There are at least two serious problems with the semantics of fork() in  a  multi-threaded
       program.  One  problem  has  to  do  with  state (for example, memory) covered by mutexes.
       Consider the case where one thread has a mutex locked and the state covered by that  mutex
       is  inconsistent  while  another  thread  calls  fork(). In the child, the mutex is in the
       locked state (locked by a nonexistent thread and thus can never be unlocked).  Having  the
       child simply reinitialize the mutex is unsatisfactory since this approach does not resolve
       the question about how to correct or otherwise deal with the  inconsistent  state  in  the
       child.

       It  is  suggested that programs that use fork() call an exec function very soon afterwards
       in the child process, thus resetting all states. In the meantime, only  a  short  list  of
       async-signal-safe library routines are promised to be available.

       Unfortunately,  this  solution  does  not  address  the needs of multi-threaded libraries.
       Application programs may not be aware that a multi-threaded library is in  use,  and  they
       feel  free  to call any number of library routines between the fork() and exec calls, just
       as they always have.  Indeed, they may be  extant  single-threaded  programs  and  cannot,
       therefore, be expected to obey new restrictions imposed by the threads library.

       On  the  other  hand, the multi-threaded library needs a way to protect its internal state
       during fork() in case it is re-entered later in the  child  process.  The  problem  arises
       especially  in  multi-threaded  I/O libraries, which are almost sure to be invoked between
       the fork() and exec calls to effect I/O redirection.  The  solution  may  require  locking
       mutex  variables  during  fork(), or it may entail simply resetting the state in the child
       after the fork() processing completes.

       The pthread_atfork() function provides multi-threaded libraries with a  means  to  protect
       themselves  from  innocent  application  programs that call fork(), and it provides multi-
       threaded application programs with a standard mechanism  for  protecting  themselves  from
       fork() calls in a library routine or the application itself.

       The  expected usage is that the prepare handler acquires all mutex locks and the other two
       fork handlers release them.

       For example, an application can supply a  prepare  routine  that  acquires  the  necessary
       mutexes  the  library  maintains  and  supply child and parent routines that release those
       mutexes, thus ensuring that the child gets a consistent  snapshot  of  the  state  of  the
       library  (and  that no mutexes are left stranded).  Alternatively, some libraries might be
       able to supply just a child routine that reinitializes the mutexes in the library and  all
       associated  states  to  some  known  value  (for  example,  what it was when the image was
       originally executed).

       When fork() is called, only the  calling  thread  is  duplicated  in  the  child  process.
       Synchronization variables remain in the same state in the child as they were in the parent
       at the time fork() was called. Thus, for example, mutex locks may be held by threads  that
       no  longer exist in the child process, and any associated states may be inconsistent.  The
       parent process may avoid this by explicit code that acquires and releases  locks  critical
       to the child via pthread_atfork().  In addition, any critical threads need to be recreated
       and reinitialized to the proper state in the child (also via pthread_atfork()).

       A higher-level package may acquire locks on its own data structures before invoking lower-
       level  packages.  Under this scenario, the order specified for fork handler calls allows a
       simple rule of initialization for avoiding package deadlock:  a  package  initializes  all
       packages on which it depends before it calls the pthread_atfork() function for itself.

FUTURE DIRECTIONS

       None.

SEE ALSO

       atexit() , fork() , the Base Definitions volume of IEEE Std 1003.1-2001, <sys/types.h>

COPYRIGHT

       Portions  of  this  text  are  reprinted  and  reproduced in electronic form from IEEE Std
       1003.1, 2003 Edition, Standard for Information Technology  --  Portable  Operating  System
       Interface  (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2003 by
       the Institute of Electrical and Electronics Engineers, Inc and  The  Open  Group.  In  the
       event  of  any  discrepancy  between this version and the original IEEE and The Open Group
       Standard, the original IEEE and The Open Group  Standard  is  the  referee  document.  The
       original Standard can be obtained online at http://www.opengroup.org/unix/online.html .