eup*_*upp 5 c linux multithreading posix
我想维护所有正在运行的线程的列表,以及有关每个线程的一些其他信息。在此答案中提到可以提供我自己的pthread_create版本并与其链接程序。我想在其覆盖版本的末尾调用原始pthread_create也很重要。
有人可以详细解释如何完成和/或提供一些代码示例吗?
您可以通过调用以下命令查找原始pthread_create-function的符号:
pthread_create_orig = dlsym(RTLD_NEXT, "pthread_create");
Run Code Online (Sandbox Code Playgroud)
包装器将如下所示:
#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);
}
Run Code Online (Sandbox Code Playgroud)
将其编译为共享库,并在启动可执行文件时将其预加载。
说明:通常,的第一个参数dlsym()是使用打开的库的句柄dlopen()。特殊句柄RTLD_NEXT用于搜索该符号的下一个出现,即默认情况下不会链接的那个。那么,这就是libpthread中的符号,而不是预加载库中的符号。
| 归档时间: |
|
| 查看次数: |
726 次 |
| 最近记录: |