table of contents
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).
Можно регистрировать три типа обработчиков:
- Типом 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.
СМ. ТАКЖЕ¶
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта Linux man-pages версии 4.16. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.
ПЕРЕВОД¶
Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov <azamat.hackimov@gmail.com>, kogamatranslator49 <r.podarov@yandex.ru>, Kogan, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
15 сентября 2017 г. | Linux |