繁体   English   中英

在Linux上的C中从PID打印文件描述符

[英]Printing file descriptors from PID in C on Linux

因此,我必须打印某个PID的所有文件描述符的名称。 我知道如何通过导航到proc/[pid]/fd的终端访问它,但是我得到的只是彩色数字。 我可以通过写ls -l来获得他们的名字。


我的问题是如何在C中打印这些名称。我尝试使用stat ,但是无法正常工作,然后使用了g_dir_open 由于我无法正确包含glib.h"galloca.h not found in glib.h" ),因此它也无法正常工作。

提前非常感谢您,哦,请记住,当我谈到Linux时,我是个傻瓜。

通过使用readdirreadlink的组合,您可以获得所有描述符的绝对路径。 在此示例中,我使用了任意的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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM