| PTHREAD_ATFORK(3) | Library Functions Manual | PTHREAD_ATFORK(3) |
pthread_atfork —
register handlers to be called when process
forks
Standard C Library (libc, -lc)
#include
<pthread.h>
int
pthread_atfork(void
(*prepare)(void), void
(*parent)(void), void
(*child)(void));
The
pthread_atfork()
function registers the provided handler functions to be called when the
fork(2) function is called. Each
of the three handlers is called at a different place in the
fork(2) sequence. The
prepare handler is called in the parent process before
the fork happens, the parent handler is called in the
parent process after the fork has happened, and the
child handler is called in the child process after the
fork has happened. The parent and
child handlers are called in the order in which they
were registered, while the prepare handlers are called
in reverse of the order in which they were registered.
Any of the handlers given may be NULL.
The intended use of
pthread_atfork()
is to provide a consistent state to a child process from a multithreaded
parent process where locks may be acquired and released asynchronously with
respect to the fork(2) call.
Each subsystem with locks that are used in a child process should register
handlers with pthread_atfork() that acquires those
locks in the prepare handler and releases them in the
parent handler.
The pthread_atfork() function returns 0 on
success and an error number on failure.
The following error code may be returned:
ENOMEM]The pthread_atfork() function conforms to
IEEE Std 1003.1c-1995
(“POSIX.1c”).
The pthread_atfork() function first
appeared in NetBSD 2.0.
After calling fork(2)
from a multithreaded process, it is only safe to call async-signal-safe
functions until calling one of the
exec(3) functions. The
pthread_*() functions are not async-signal-safe, so
it is not safe to use such functions in the child
handler. POSIX does not mandate that
pthread_mutex_unlock() be async-signal-safe, but it
is in NetBSD and thus safe to use within the
child handler.
There is no way to unregister a handler registered with
pthread_atfork().
| July 18, 2014 | NetBSD 11.0 |