如何进行linuxthreads源码分析ptfork.c
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇文章给大家分享的是有关如何进行linuxthreads源码分析ptfork.c,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ptfo
千家信息网最后更新 2025年12月02日如何进行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安全错误
数据库的锁怎样保障安全
福建光源软件开发
电脑部分网页找不到服务器
学软件开发毕业做什么
华南x79能用服务器内存嘛
没上大学就不能学软件开发
19寸服务器机柜
鹿泉区委网络安全委员会
数码宝贝服务器未开放
隐私浏览器网络安全防护
如何获取别人服务器id
汉阳定制软件开发中心
视频监控软件开发公司有哪些
数据库如何导入另一台电脑
共享怎么设置拷数据库
电脑修图软件开发
网络安全平台的作用
电脑网络显示无网络安全
数据库判断成绩
网络安全行业资质证书
网络安全主题创意绘画没有字
贵州建工网络安全
性能最好的数据库
成都乐育网络技术有限公司
直播姬服务器错误904
如何在手机上建立我的世界服务器
敏捷开发在软件开发中的地位
网络安全检测探针服务器
有5g数据库吗
如何生成数据库模拟数据
我的世界密室服务器怎么玩