c - 如何在链接期间替换 pthread_create

标签 c linux multithreading posix

我想维护一个包含所有正在运行的线程的列表以及关于每个线程的一些附加信息。在这个answer提到可以提供我自己的 pthread_create 版本并将程序与其链接。 同样重要的是,我想在覆盖版本的末尾调用原始 pthread_create。

有人可以详细解释如何完成和/或提供一些代码示例吗?

最佳答案

您可以通过调用查找原始 pthread_create 函数的符号:

pthread_create_orig = dlsym(RTLD_NEXT, "pthread_create");

包装器看起来像:

#include <dlfcn.h>

int (*pthread_create_orig)(pthread_t *, const pthread_attr_t *, void *(*) (void *), void *);

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start) (void *), void *arg) {
       if (!pthread_create_orig)
           pthread_create_orig = dlsym(RTLD_NEXT, "pthread_create");
       return pthread_create_orig(thread, attr, start, arg);
}

将其编译为共享库并在启动可执行文件时预加载它。

说明:通常,dlsym() 的第一个参数是用dlopen() 打开的库的句柄。特殊句柄 RTLD_NEXT 用于搜索该符号的下一次出现,即默认情况下不会链接的那个。这是 libpthread 中的符号,而不是预加载库中的符号。

关于c - 如何在链接期间替换 pthread_create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34840510/

相关文章:

c++ - 锁定 std::map C++

java - JProgressBar 无法从 ActionEvent 正确显示

将长整数(十进制)转换为基数为 36 的字符串(C 中的 strtol 反转函数)

计算数组的数量

linux - 阻止用户查看公用文件夹

c# - Dotnet 应用程序作为守护进程启动,无法正常工作

java - 如何使用 XMLEncoder 使 Arraylist 线程安全且可序列化

c - 用 C 语言运行 rand() 并使用 Shell 脚本循环

在c中将十六进制数转换为八进制

c - 如何在非规范模式下从读取函数返回且 VMIN 和 TIME 不等于零