/proc 获取动态库的绝对路径
时间: 2023-09-23 20:13:26 浏览: 47
要获取动态库的绝对路径,可以使用以下步骤:
1. 找到该动态库的进程ID(PID),可以通过命令 `pidof <进程名>` 来获取。
2. 进入 `/proc/<PID>/maps` 目录,这个目录下包含了该进程加载的所有库的内存地址信息。
3. 找到对应的动态库所在的行,通常以 `.so` 结尾,其格式为 `<起始地址>-<结束地址> r-xp <偏移量> <设备号:节点号> <文件名>`。
4. 文件名即为动态库的名称,其绝对路径为 `/proc/<PID>/exe` 目录下的符号链接。
例如,要获取进程名为 `myapp` 中 `libmylib.so` 的绝对路径,可以使用以下命令:
```
$ pidof myapp
1234
$ cat /proc/1234/maps | grep libmylib.so
7f1234567000-7f1234568000 r-xp 00000000 00:00 0 /path/to/libmylib.so
$ readlink /proc/1234/exe
/path/to/myapp
```
因此,`libmylib.so` 的绝对路径为 `/path/to/libmylib.so`。
相关问题
代码中使用/proc 获取动态库的绝对路径
在Linux系统下,可以使用/proc/{PID}/maps文件获取进程的内存映射信息。在其中可以找到动态库的加载地址和绝对路径。
以下是获取动态库绝对路径的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAX_PATH 256
char* get_lib_path(pid_t pid, const char* lib_name) {
char maps_path[MAX_PATH];
char line[MAX_PATH];
char* path;
snprintf(maps_path, MAX_PATH, "/proc/%d/maps", pid);
FILE* fp = fopen(maps_path, "r");
if (!fp) {
perror("fopen");
exit(EXIT_FAILURE);
}
while (fgets(line, MAX_PATH, fp)) {
if (strstr(line, lib_name)) {
path = strtok(line, " ");
path = strtok(NULL, " ");
path[strlen(path) - 1] = '\0';
break;
}
}
fclose(fp);
return path;
}
int main() {
pid_t pid = getpid();
const char* lib_name = "libc.so.6";
char* path = get_lib_path(pid, lib_name);
printf("%s is loaded at %s\n", lib_name, path);
return 0;
}
```
注意:该方法只适用于获取当前进程动态库的绝对路径,无法获取其他进程的动态库路径。另外,/proc目录下的文件和目录只有在Linux系统下才存在,其他操作系统可能无法使用。
Linux /proc获取进程使用的内存信息
可以通过访问/proc/[pid]/status文件获取进程使用的内存信息。其中,[pid]是进程的PID。在该文件中,可以找到如下信息:
VmPeak: 进程使用的最大虚拟内存(包括共享库、堆、栈等)
VmSize: 进程当前的虚拟内存大小
VmLck: 锁定的物理内存大小
VmPin: 固定的内存大小
VmHWM: 进程使用过的最大物理内存
VmRSS: 非交换物理内存大小
VmData: 程序数据段大小
VmStk: 栈段大小
VmExe: 可执行文件大小
VmLib: 共享库大小
VmPTE: 页面表项大小
其中,VmRSS是最常用的一个指标,它表示进程当前正在使用的非交换物理内存大小。