summaryrefslogtreecommitdiffstats
path: root/man3p/pthread_atfork.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man3p/pthread_atfork.3p')
-rw-r--r--man3p/pthread_atfork.3p153
1 files changed, 153 insertions, 0 deletions
diff --git a/man3p/pthread_atfork.3p b/man3p/pthread_atfork.3p
new file mode 100644
index 000000000..e272e5fb4
--- /dev/null
+++ b/man3p/pthread_atfork.3p
@@ -0,0 +1,153 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "PTHREAD_ATFORK" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" pthread_atfork
+.SH NAME
+pthread_atfork \- register fork handlers
+.SH SYNOPSIS
+.LP
+\fB#include <pthread.h>
+.br
+.sp
+int pthread_atfork(void (*\fP\fIprepare\fP\fB)(void), void (*\fP\fIparent\fP\fB)(void),
+.br
+\ \ \ \ \ \ void (*\fP\fIchild\fP\fB)(void)); \fP
+\fB
+.br
+\fP
+.SH DESCRIPTION
+.LP
+The \fIpthread_atfork\fP() function shall declare fork handlers to
+be called before and after \fIfork\fP(), in the context of the thread
+that called \fIfork\fP(). The \fIprepare\fP fork handler shall be
+called before \fIfork\fP() processing commences. The \fIparent\fP
+fork handle shall be called after \fIfork\fP() processing completes
+in the parent process. The \fIchild\fP fork handler shall be
+called after \fIfork\fP() 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.
+.LP
+The order of calls to \fIpthread_atfork\fP() is significant. The \fIparent\fP
+and \fIchild\fP fork handlers shall be called
+in the order in which they were established by calls to \fIpthread_atfork\fP().
+The \fIprepare\fP fork handlers shall be called
+in the opposite order.
+.SH RETURN VALUE
+.LP
+Upon successful completion, \fIpthread_atfork\fP() shall return a
+value of zero; otherwise, an error number shall be returned
+to indicate the error.
+.SH ERRORS
+.LP
+The \fIpthread_atfork\fP() function shall fail if:
+.TP 7
+.B ENOMEM
+Insufficient table space exists to record the fork handler addresses.
+.sp
+.LP
+The \fIpthread_atfork\fP() function shall not return an error code
+of [EINTR].
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.LP
+None.
+.SH APPLICATION USAGE
+.LP
+None.
+.SH RATIONALE
+.LP
+There are at least two serious problems with the semantics of \fIfork\fP()
+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 \fIfork\fP(). 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.
+.LP
+It is suggested that programs that use \fIfork\fP() call an \fIexec\fP
+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.
+.LP
+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 \fIfork\fP() and \fIexec\fP
+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.
+.LP
+On the other hand, the multi-threaded library needs a way to protect
+its internal state during \fIfork\fP() 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 \fIfork\fP()
+and \fIexec\fP calls to effect I/O redirection. The solution may require
+locking mutex
+variables during \fIfork\fP(), or it may entail simply resetting the
+state in the child after
+the \fIfork\fP() processing completes.
+.LP
+The \fIpthread_atfork\fP() function provides multi-threaded libraries
+with a means to protect themselves from innocent
+application programs that call \fIfork\fP(), and it provides multi-threaded
+application
+programs with a standard mechanism for protecting themselves from
+\fIfork\fP() calls in a
+library routine or the application itself.
+.LP
+The expected usage is that the \fIprepare\fP handler acquires all
+mutex locks and the other two fork handlers release them.
+.LP
+For example, an application can supply a \fIprepare\fP routine that
+acquires the necessary mutexes the library maintains and
+supply \fIchild\fP and \fIparent\fP 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
+\fIchild\fP 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).
+.LP
+When \fIfork\fP() 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 \fIfork\fP() 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 \fIpthread_atfork\fP().
+In addition, any critical threads need to be
+recreated and reinitialized to the proper state in the child (also
+via \fIpthread_atfork\fP()).
+.LP
+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 \fIpthread_atfork\fP()
+function for itself.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIatexit\fP() , \fIfork\fP() , the Base Definitions volume of
+IEEE\ Std\ 1003.1-2001, \fI<sys/types.h>\fP
+.SH 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 .