PTHREAD_ATFORK(3) | Руководство программиста Linux | 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).
Можно регистрировать три типа обработчиков:
Любой из трёх аргументов может быть равен NULL, если обработчик не требуется на соответствующем шаге работы fork(2).
При успешном выполнении pthread_atfork() возвращается ноль. При ошибке возвращается номер ошибки. Функция pthread_atfork() может быть вызвана нитью несколько раз для регистрации нескольких обработчиков каждого шага. Обработчики каждого шага вызываются в определённом порядке: обработчики prepare вызываются в порядке обратном регистрации; обработчики parent и child вызываются в порядке их регистрации.
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.
2017-09-15 | Linux |