如何进行linuxthreads源码分析ptfork.c
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇文章给大家分享的是有关如何进行linuxthreads源码分析ptfork.c,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ptfo
千家信息网最后更新 2026年11月01日如何进行linuxthreads源码分析ptfork.c
本篇文章给大家分享的是有关如何进行linuxthreads源码分析ptfork.c,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
ptfork.c实现了pthread_atfork函数,该函数的作用见pthread_atfork(3) - Linux manual page和源码中的pthread_atfork.man文件。
/* The "atfork" stuff */
#include
#include
#include
#include "pthread.h"
#include "internals.h"
struct handler_list {
void (*handler)(void);
struct handler_list * next;
};
// 用于互斥访问链表的互斥变量
static pthread_mutex_t pthread_atfork_lock = PTHREAD_MUTEX_INITIALIZER;
// 三个链表
static struct handler_list * pthread_atfork_prepare = NULL;
static struct handler_list * pthread_atfork_parent = NULL;
static struct handler_list * pthread_atfork_child = NULL;
// 生成一个新的handler_list节点插入到list中
static void pthread_insert_list(struct handler_list ** list,
void (*handler)(void),
struct handler_list * newlist,
int at_end)
{
if (handler == NULL) return;
// 插入到最后,则先把直接指向尾节点
if (at_end) {
while(*list != NULL) list = &((*list)->next);
}
// 保存数据到新节点
newlist->handler = handler;
// *list即第一个节点的地址
newlist->next = *list;
// *list的内容修改为新节点
*list = newlist;
}
struct handler_list_block {
struct handler_list prepare, parent, child;
};
int pthread_atfork(void (*prepare)(void),
void (*parent)(void),
void (*child)(void))
{
struct handler_list_block * block =
(struct handler_list_block *) malloc(sizeof(struct handler_list_block));
if (block == NULL) return ENOMEM;
pthread_mutex_lock(&pthread_atfork_lock);
/* "prepare" handlers are called in LIFO */
// 把三个函数保存到一个节点中,如果这个节点分别插入三个handle_list队列
pthread_insert_list(&pthread_atfork_prepare, prepare, &block->prepare, 0);
/* "parent" handlers are called in FIFO */
pthread_insert_list(&pthread_atfork_parent, parent, &block->parent, 1);
/* "child" handlers are called in FIFO */
pthread_insert_list(&pthread_atfork_child, child, &block->child, 1);
pthread_mutex_unlock(&pthread_atfork_lock);
return 0;
}
// handle_list链表中每个节点的函数
static inline void pthread_call_handlers(struct handler_list * list)
{
for (/*nothing*/; list != NULL; list = list->next) (list->handler)();
}
extern int __fork(void);
// http://man7.org/linux/man-pages/man3/pthread_atfork.3.html
/*
glibc中定义了fork和__fork的关系。
weak_alias (__fork, fork)
# define weak_alias(name, aliasname) _weak_alias (name, aliasname)
# define _weak_alias(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)))
fork是弱符号,并且是__fork的的别名。即如果定义了fork,则会覆盖glibc中的fork。
这里就是覆盖glibc的fork,然后在调用glibc的__fork之前执行一些额外的操作。这样用户在执行fork的时候,
就会执行下面这个fork函数,从而执行glibc的__fork
*/
int fork(void)
{
int pid;
struct handler_list * prepare, * child, * parent;
pthread_mutex_lock(&pthread_atfork_lock);
prepare = pthread_atfork_prepare;
child = pthread_atfork_child;
parent = pthread_atfork_parent;
pthread_mutex_unlock(&pthread_atfork_lock);
// 调fork之前调用函数列表
pthread_call_handlers(prepare);
pid = __fork();
// 子进程
if (pid == 0) {
__pthread_reset_main_thread();
__fresetlockfiles();
pthread_call_handlers(child);
} else {
// 父进程
pthread_call_handlers(parent);
}
return pid;
}
以上就是如何进行linuxthreads源码分析ptfork.c,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
节点
函数
源码
三个
分析
就是
更多
知识
篇文章
进程
实用
作用
内容
别名
变量
地址
工作会
指向
数据
文件
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
湖南永感互联网科技有限公司
重生之互联网科技帝国
互联网与科技金融数据
关于新基建和互联网科技
互联网金融公司科技
碳银互联网科技
赫美联合互联网科技
互联网金融和金融科技
重庆科技学院互联网
隆华科技工业互联网
科技互联网的估值
上海宁丞科技互联网
花神(南京)互联网科技有限公司
千方科技属于互联网企业吗
卓翼科技产业互联网合作
互联网时代科技型公司的机会
银川新华互联网科技学校是国营吗
互联网领先科技活动
中国互联网公司的科技投入
银川新华互联网科技学校原画
天津市摩尔互联网科技
博彦科技互联网金融
美国互联网科技
互联网科技排名
迪茉互联网科技
狮子座互联网科技培训
互联网科技的未来发展
浙江互联网科技研学营
互联网科技收购价值
每日互联网科技新闻