pthread_atfork(3c) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

pthread_atfork(3c)

pthread_atfork(3C)       Standard C Library Functions       pthread_atfork(3C)

NAME
       pthread_atfork - register fork handlers

SYNOPSIS
       #include <sys/types.h>
       #include <unistd.h>

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

DESCRIPTION
       The pthread_atfork() function declares fork handlers to be called prior
       to and following fork(2), within the thread that called fork(). The or‐
       der of calls to pthread_atfork() is significant.


       Before  fork()  processing  begins, the prepare fork handler is called.
       The prepare handler is not called if its address is NULL.


       The parent fork handler is called after fork() processing  finishes  in
       the  parent  process, and the child fork handler is called after fork()
       processing finishes in the child process. If the address of  parent  or
       child is NULL, then its handler is not called.


       The  prepare  fork handler is called in LIFO (last-in first-out) order,
       whereas the parent and child fork handlers are called in FIFO (first-in
       first-out) order. This calling order allows  applications  to  preserve
       locking order.


       Any  fork()  handlers registered by using the pthread_atfork() function
       should attempt to minimize the work they do. They  should  limit  them‐
       selves  to  using  Async-Signal-Safe  functions or thread locking func‐
       tions. They should not call library functions,  since  those  libraries
       may  have registered their own pthread_atfork() handlers to acquire in‐
       ternal locks (see the example below), which could in turn lead to dead‐
       locks. This includes avoiding the use of any interfaces which  may  di‐
       rectly or indirectly attempt to allocate memory.

RETURN VALUES
       Upon  successful  completion, pthread_atfork() returns 0. Otherwise, an
       error number is returned.

ERRORS
       The pthread_atfork() function will fail if:

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


USAGE
       Solaris  threads  do not offer pthread_atfork() functionality (there is
       no thr_atfork() interface). However, a Solaris threads application  can
       call  pthread_atfork()  to  ensure  fork()-safety, since the two thread
       APIs are interoperable. See fork(2) for information relating to  fork()
       in a Solaris threads environment in Solaris 10 relative to previous re‐
       leases.

EXAMPLES
       Example 1 Make a library safe with respect to fork().



       All multithreaded applications that call fork() in a POSIX threads pro‐
       gram and do more than simply call exec(2) in the child of the fork need
       to ensure that the child is protected from deadlock.



       Since  the "fork-one" model results in duplicating only the thread that
       called fork(), it is possible that at the  time  of  the  call  another
       thread  in the parent owns a lock. This thread is not duplicated in the
       child, so no thread will unlock this lock in the child. Deadlock occurs
       if the single thread in the child needs this lock.



       The problem is more serious with locks in libraries.  Since  a  library
       writer does not know if the application using the library calls fork(),
       the  library  must protect itself from such a deadlock scenario. If the
       application that links with this library calls fork() and does not call
       exec() in the child, and if it needs a library lock that may be held by
       some other thread in the parent that is inside the library at the  time
       of the fork, the application deadlocks inside the library.



       The  following  describes  how  to  make a library safe with respect to
       fork() by using pthread_atfork().


           1.     Identify  all  locks  used  by  the  library  (for   example
                  {L1,...Ln}). Identify also the locking order for these locks
                  (for example {L1...Ln}, as well.)


           2.     Add  a  call  to pthread_atfork(f1, f2, f3) in the library's
                  .init section. f1, f2, f3 are defined as follows:




         f1()
         {
                 /* ordered in lock order */
                 pthread_mutex_lock(L1);
                 pthread_mutex_lock(...);
                 pthread_mutex_lock(Ln);
         }

         f2()
         {
                 pthread_mutex_unlock(L1);
                 pthread_mutex_unlock(...);
                 pthread_mutex_unlock(Ln);
         }

         f3()
         {
                 pthread_mutex_unlock(L1);
                 pthread_mutex_unlock(...);
                 pthread_mutex_unlock(Ln);
         }



ATTRIBUTES
       See attributes(7) for descriptions of the following attributes:

       tab() box; cw(2.75i) |cw(2.75i) lw(2.75i) |lw(2.75i) ATTRIBUTE  TYPEAT‐
       TRIBUTE  VALUE _ Interface StabilityCommitted _ MT-LevelMT-Safe _ Stan‐
       dardSee standards(7).


SEE ALSO
       exec(2), fork(2), atexit(3C), attributes(7), standards(7)

Oracle Solaris 11.4               29 Nov 2016               pthread_atfork(3C)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3