Linux repositories inspector

pthread_atfork(3) - Russkiy

Linux
2017-09-15

man-pages-ru

Russian man pages from the Linux Documentation Project

glibc-doc

GNU C Library: Documentation

man-pages

Linux kernel and C library user-space interface documentation

ИМЯ

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.

СМОТРИТЕ ТАКЖЕ

⇧ Top