pthread_atfork 子例程

用途

注册派生处理程序。

线程库 (libpthreads.a)

语法

#include <sys/types.h>
#include <unistd.h>

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

描述

pthread_atfork 子例程注册派生清除处理程序。 在开始处理 fork 子例程之前调用 prepare 处理程序。 在父进程中完成对 fork 子例程的处理之后,将调用 parent 处理程序。 在子进程中完成对 fork 子例程的处理之后,将调用 child 处理程序。

当调用 fork 子例程时,只有调用线程在子进程中重复,但所有同步变量都重复。 pthread_atfork 子例程提供了一种防止状态不一致和产生死锁的方法。 期望的用法是 prepare 处理程序获取所有互斥对象,而另外两个处理程序在父进程和子进程中释放这些互斥对象。

准备处理程序按 LIFO (最后一个先进先出) 顺序调用; 而父处理程序和子处理程序按 FIFO (先进先出) 顺序调用。 此后,对 pthread_atfork 子例程的调用顺序很重要。

注: pthread.h 头文件必须是使用线程库的每个源文件的第一个包含文件。

参数

描述
准备 指向预派生清除处理程序。 如果不需要预派生处理,那么应将此指针的值设置为 NULL
指向父级派生后清除处理程序。 如果不需要父级派生后处理,那么应将此指针的值设置为 NULL
子级 指向子级派生后清除处理程序。 如果不需要子级派生后处理,那么应将此指针的值设置为 NULL

返回值

成功完成时, pthread_atfork 子例程返回零值。 否则,将返回错误号以指示错误。

错误代码

在下列情况下, pthread_atfork 子例程将失败:

描述
ENOMEM 没有足够的表空间来记录派生处理程序地址。

pthread_atfork 子例程不会返回错误代码 EINTR