我想维护所有正在运行的线程的列表,以及有关每个线程的一些附加信息。在这个answer https://stackoverflow.com/a/3476240/4676150提到可以提供我自己的 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 中的符号,而不是预加载库中的符号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)