如何打印出 linux 内核模块的访问权限
How to print out the access right from linux kernel module
当我从终端运行 命令 lsof 时,它会显示所有带有 header 的文件描述符的详细列表是 FD。像 1u 这样的 FD 列号是实际的文件描述符,后面跟着它的模式的 u,r,w 为:
- r 用于读取权限
- w 用于写访问
- u 用于读写访问
我的问题是如何从 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)
提取两个标志。然后切换该表达式的结果:
- 结果等于
FMODE_READ
表示“r”。
- 结果等于
FMODE_WRITE
表示“w”。
- 结果等于表达式
FMODE_READ | FMODE_WRITE
表示“u”。
当我从终端运行 命令 lsof 时,它会显示所有带有 header 的文件描述符的详细列表是 FD。像 1u 这样的 FD 列号是实际的文件描述符,后面跟着它的模式的 u,r,w 为:
- r 用于读取权限
- w 用于写访问
- u 用于读写访问
我的问题是如何从 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)
提取两个标志。然后切换该表达式的结果:
- 结果等于
FMODE_READ
表示“r”。 - 结果等于
FMODE_WRITE
表示“w”。 - 结果等于表达式
FMODE_READ | FMODE_WRITE
表示“u”。