PTHREAD_ATFORK - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-08-13
名称
pthread_atfork-注册派生处理程序
语法
#include <pthread.h> int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));
与-pthread链接。
说明
pthread_atfork()函数注册该线程调用fork(2)时要执行的fork处理程序。处理程序在调用fork(2)的线程的上下文中执行。
可以注册三种处理程序:
- *
- prepare指定在fork(2)处理开始之前执行的处理程序。
- *
- parent指定在fork(2)处理完成后在父进程中执行的处理程序。
- *
- child指定在fork(2)处理完成之后在子进程中执行的处理程序。
如果在fork(2)处理的相应阶段不需要处理程序,则三个参数中的任何一个都可以为NULL。
返回值
成功时,pthread_atfork()返回零。出现错误时,它将返回错误号。线程可以多次调用pthread_atfork(),以便为每个阶段注册多个处理程序。每个阶段的处理程序都以指定的顺序调用:prepare处理程序以注册的相反顺序调用;父处理程序和子处理程序按注册顺序调用。
错误说明
- ENOMEM
- 无法分配内存来记录表单处理程序条目。
遵循规范
POSIX.1-2001,POSIX.1-2008。
备注
在多线程进程中调用fork(2)时,只有调用线程在子进程中重复。 pthread_atfork()的初衷是允许调用线程返回到一致状态。例如,在调用fork(2)时,其他线程可能具有锁定的互斥锁,这些互斥锁在子代中重复的用户空间内存中可见。这样的互斥锁将永远不会被解锁,因为放置锁的线程不会在子进程中重复。 pthread_atfork()的目的是提供一种机制,通过该机制,应用程序(或库)可以确保互斥体以及其他进程和线程状态将恢复为一致状态。在实践中,此任务通常太难于实践。
在多线程进程中的fork(2)返回子级之后,该子级应仅调用异步信号安全函数(请参见signal-safety(7)),直到它调用execve(2)执行新程序为止。
POSIX.1指定pthread_atfork()不会因错误EINTR而失败。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。