我想维护一个包含所有正在运行的线程的列表以及关于每个线程的一些附加信息。在这个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/