如何进行linuxthreads源码分析ptfork.c
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,本篇文章给大家分享的是有关如何进行linuxthreads源码分析ptfork.c,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ptfo
千家信息网最后更新 2025年01月31日如何进行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安全错误
数据库的锁怎样保障安全
文献检索实时数据库名词解释
金桥网络安全
服务器分机怎么开视频
武汉大学网络安全学什么
云函数修改数据库数据
公司的网络技术员叫什么
邮件系统数据库
东谷北京软件开发公司
奉贤区品牌软件开发费用是多少
空桑网络安全法则
交易形数据库
吉林联想服务器
维护数据和数据库安全
宁夏办公软件开发联系电话
网络安全保障十大原因
电脑服务器机箱
上海系统软件开发价钱
昌平区常规软件开发平台哪家强
网络安全工程培训基础
项目数据库制作
全方位网络安全防线构造方法
mirna数据库
社交电商软件开发方案
中文期刊检索证明用什么数据库
数据库营业收入构成明细
网络安全行业的下一个目标
单位 信息网络安全制度
Mac为什么适合软件开发
软件开发工程师保姆
怎样把电脑变成服务器