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# - 从 SHELLEXECUTEINFO 获取类名

C Ansi 内存分配闭包

linux - 检查 Linux text/fb 控制台当前是否按住 shift 键

java - 当其中一个线程完成时停止所有线程

python - 如何测试访问数据库的其他线程

c - 如何在 c 中将字符串转换为十六进制,反之亦然?

c - 为什么会有不同的答案?

linux - 当前行和上一行的 AWK 纪元差异

c - 如何创建仅在链接 pthread 时才使用互斥体的库?

django - cherrypy 如何处理用户线程?