如何打印出 linux 内核模块的访问权限

How to print out the access right from linux kernel module

当我从终端运行 命令 lsof 时,它会显示所有带有 header 的文件描述符的详细列表是 FD。像 1u 这样的 FD 列号是实际的文件描述符,后面跟着它的模式的 u,r,w 为:

我的问题是如何从 linux 内核模块打印出这些类型的访问? 我能够打印 files_path (见吸引的图片)。我在 here 中看到文件结构中有 f_mode 并尝试将其打印出来并收到大数字,例如 1208647709 或 917507

The results after running dmesg

这是我的代码

struct task_struct *task_list;
struct fdtable *        fdt = NULL;
unsigned int process_count = 0;
int fd_i;
char  tmpbuf[256];
char * process_path = "";
struct path files_path;
unsigned int mode_path;
char *cwd;
for_each_process(task_list) {
    pr_info("Process: %s\t PID:[%d]\t State:%s\n", 
            task_list->comm, task_list->pid,
            get_task_state(task_list->state));
    if (task_list->files == NULL) continue; 
    fdt = files_fdtable(task_list->files);
    int i=0;
    while(fdt->fd[i] != NULL) { 
        files_path = fdt->fd[i]->f_path;
        mode_path = fdt->fd[i]->f_mode;
        cwd = d_path(&files_path,buf,100*sizeof(char));
        printk(KERN_INFO "Open file with fd %d  %s **mode: %d**", i,cwd, mode_path);            
        i++;
    }
}

有人可以评论并支持我解决这个问题吗?

Tsyvarev 的解决方案: 使用 f_mode & (FMODE_READ | FMODE_WRITE) 提取两个标志。然后切换该表达式的结果:

  1. 结果等于FMODE_READ表示“r”。
  2. 结果等于FMODE_WRITE表示“w”。
  3. 结果等于表达式 FMODE_READ | FMODE_WRITE 表示“u”。