所以我必须打印某个PID的所有文件描述符的名称。我知道如何通过导航到proc/[pid]/fd
的终端访问它,但我得到的只是彩色数字。我可以写ls -l
来得到他们的名字。
我的问题是如何在C中打印这些名称。我尝试使用stat
,但我无法使用它,然后我使用了g_dir_open
。由于我无法正确包含glib.h
("galloca.h not found in glib.h"
),所以它无法正常工作。
非常感谢您提前, 哦,请记住,当涉及到Linux时,我是一个完全傻瓜。
答案 0 :(得分:2)
通过使用readdir
和readlink
的组合,您可以获得所有描述符的绝对路径。在此示例中,我使用了一个仲裁pid,您可以将其设置为命令行参数,或者无论如何都要调用该函数。
#include <stdio.h>
#include <fcntl.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char *path = "/proc/3525/fd";
DIR *fd_dir = opendir(path);
if (!fd_dir) {
perror("opendir");
return 0;
}
struct dirent *cdir;
size_t fd_path_len = strlen(path) + 10;
char *fd_path = malloc(sizeof(char) * fd_path_len);
char *buf = malloc(sizeof(char) * PATH_MAX + 1);
while ((cdir = readdir(fd_dir))) {
if (strcmp(cdir->d_name, ".") == 0 ||
strcmp(cdir->d_name, "..") == 0)
continue;
snprintf(fd_path, fd_path_len - 1, "%s/%s", path, cdir->d_name);
printf("Checking: %s\n", fd_path);
ssize_t link_size = readlink(fd_path, buf, PATH_MAX);
if (link_size < 0)
perror("readlink");
else {
buf[link_size] = '\0';
printf("%s\n", buf);
}
memset(fd_path, '0', fd_path_len);
}
closedir(fd_dir);
free(fd_path);
free(buf);
return 0;
}