PTHREAD_ATFORK(3)

ИМЯ
pthread_atfork - регистрирует обработчики ветвления

ОБЗОР
#include <pthread.h>

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

Компонуется при указании параметра -pthread.

ОПИСАНИЕ
Функция pthread_atfork() регистрирует обработчик ветвления, которые будут запускаться при вызове fork(2) этой нитью. Обработчики запускаются в контексте нити, которая вызвала fork(2).

Можно регистрировать три типа обработчиков:

*   Типом prepare задаётся обработчик, который выполняется од начала работы fork(2).

*   Типом parent задаётся обработчик, который выполняется в родительском процессе после завершения работы fork(2).

*   Типом child задаётся обработчик, который выполняется в потомке после завершения работы fork(2).

Любой из трёх аргументов может быть равен NULL, если обработчик не требуется на соответствующем шаге работы fork(2).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении pthread_atfork() возвращается ноль. При ошибке возвращается номер ошибки. Функция pthread_atfork() может быть вызвана нитью несколько раз для регистрации нескольких обработчиков каждого шага. Обработчики каждого шага вызываются в определённом порядке: обработчики prepare вызываются в порядке обратном регистрации; обработчики parent и child вызываются в порядке их регистрации.

ОШИБКИ

ENOMEM
    Невозможно выделить память для записи элемента обработчика.

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.

ЗАМЕЧАНИЯ
При вызове fork(2) в многонитевом процессе в дочернем процессе делается копия только вызвавшей нити. Первоначальной целью pthread_atfork() было позволить возвращаться в вызывающей нити в целостном состоянии. Например, на момент вызова fork(2) другие нити могут заблокировать мьютексы, которые видимы в памяти пользовательского пространства копии в потомке. Такие мьютексы никогда не разблокируются, так как нити, создавшие блокировку, не копируются в потомок. Целью pthread_atfork() было предоставить механизм, позволяющий приложению (или библиотеке) сделать так, чтобы мьютексы, другой процесс и состояние нити восстанавливались бы в целостном состоянии. На практике, эта задача очень сложна для реализации.

В многонитевом процессе fork(2) возвращает управление в потомок; потомок должен вызывать только функции async-signal-safe (смотрите signal-safety(7)) до момента, пока не вызовет execve(2) для выполнения новой программы.

В POSIX.1 указано, что pthread_atfork() не должен завершаться ошибкой EINTR.

СМОТРИТЕ ТАКЖЕ
fork(2), atexit(3), pthreads(7)