gpt4 book ai didi

path - linux内核模块中fd inode的可执行路径

转载 作者:行者123 更新时间:2023-12-04 16:11:03 25 4
gpt4 key购买 nike

  • 给定一个 inode存在于 /proc/**/fd/*
  • 以及需要从符号链接(symbolic link)/proc/**/exe 中查找可执行路径的Linux 内核模块

  • 我怎样才能实现这一点,以便从一个 inode 号我使用 fd 获得可执行文件的路径?

    最佳答案

    proc_inode struct PROC_I macro都是内部的。见 [PATCH 27/28] proc: Make the PROC_I() and PDE() macros internal toprocfs [RFC] .

    相反,如何迭代 inode 的 dentry 列表呢?您可以使用 dentry_path_raw()寻找 /*/fd/*路径名:

    //struct inode *proc_inode;

    struct dentry *dentry;
    pid_t pid;
    int found_match = 0;

    printk(KERN_DEBUG "superblock type name: %s\n", proc_inode->i_sb->s_type->name);

    // An inode's dentry list is protected by the i_lock. See:
    // - "dcache->d_inode->i_lock protects: i_dentry, d_u.d_alias, d_inode of aliases"
    // http://lxr.free-electrons.com/source/fs/dcache.c?v=4.0#L48
    // - The implementation of d_prune_aliases()
    // http://lxr.free-electrons.com/source/fs/dcache.c?v=4.0#L882
    spin_lock(&proc_inode->i_lock);
    hlist_for_each_entry(dentry, &proc_inode->i_dentry, d_u.d_alias) {
    char buf[64];
    const char *path_raw;
    char c;

    path_raw = dentry_path_raw(dentry, buf, sizeof(buf));

    // dentry_path_raw() places the path into `buf'. If `buf' is not large
    // enough, then continue on to the next dentry.
    if (!(buf <= path_raw && path_raw <= buf + sizeof(buf) - 1)) {
    printk(KERN_DEBUG "`buf' not large enough, dentry_path_raw() returned %ld\n", PTR_ERR(path_raw));
    continue;
    }

    printk(KERN_DEBUG "path_raw = %s\n", path_raw);

    // We're looking to match: ^/(\d*)/fd/

    if (*path_raw++ != '/') continue;

    pid = 0;
    for (c = *path_raw; c; c = *++path_raw) {
    if ('0' <= c && c <= '9') {
    pid = 10 * pid + (c - '0');
    } else {
    break;
    }
    }

    if (*path_raw++ != '/') continue;
    if (*path_raw++ != 'f') continue;
    if (*path_raw++ != 'd') continue;
    if (*path_raw != '/' && *path_raw != '\0') continue;

    // Found a match. Break the dentry list loop.
    found_match = 1;
    printk(KERN_DEBUG "breaking dentry list loop\n");
    break;
    }
    spin_unlock(&proc_inode->i_lock);

    if (found_match) {
    printk(KERN_DEBUG "pid = %d\n", (int)pid);
    }

    编辑:我已经上传了一个演示项目到 GitHub:
    https://github.com/dtrebbien/so16317923-proc-fs-kernel-module

    关于path - linux内核模块中fd inode的可执行路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16317923/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com