解析/ proc / maps?

时间:2018-11-04 09:40:17

标签: c file parsing process proc

我用C语言编写了以下代码。到目前为止,我要做的是打开proc目录并读取内部的进程-不包含数字字符的字典被忽略了,因为我只想查看数字目录。我要做的是打印proc目录中具有读写权限的所有进程的PID。我的问题是如何从proc /.../ maps文件中提取进程的权限?

这是我遇到麻烦的代码片段:

sprintf(buf, "/proc/%d/maps", tgid->d_name); 
file = fopen(buf, "r");

while (fgets(buf, sizeof(buf), file)) {
    sscanf(buf, "%x-%x %4c %x %x:%x", &from, &to, flags, &offset, &major, &minor);
}

fclose(file);
if (flags[0] == 'r' && flags[1] == 'w') {
    printf("%d\n", tgid->d_name);
}      

2 个答案:

答案 0 :(得分:1)

  

我要做的是打印所有可读写进程的PID。

process是某些operating system提供的抽象。说“可读”过程(或“可写”过程)或具有“读”权限或“写”权限的过程是没有意义的,因为它与file system permissions有关。进程不是文件,其/proc/1234/目录只是内核给出的对该进程的 view 。某个进程正在使用file descriptors访问文件(您可能会扫描其/proc/1234/fd/目录)。

proc(5)文件系统是特定于Linux的伪文件系统。 /proc/$pid/maps是显示过程virtual address space的文本视图。您可以顺序读取该伪文件。

要更改其虚拟地址空间,Linux进程将使用execve(2)munmapmmap(2)(为新程序初始化新的虚拟地址空间)之类的系统调用,{ {3}}等...

要以编程方式扫描目录(例如/proc/1234/fd/甚至是/proc/),请在mprotect(2)循环后将opendir(3)closedir一起使用(您将可能还会在您构建的文件路径上使用readdir(3)。在某些情况下,您可以使用stat(2)

也请阅读nftw(3),以广泛了解操作系统。

编辑后

  

我要做的是打印proc目录中具有读写权限的所有进程的PID

那没有道理。 进程没有权限,但确实具有 Operating Systems: Three Easy Pieces (用于定义允许对该进程进行哪些文件访问)。您可以解析/proc/1234/status来查找pid 1234的处理凭据(尤其是该伪文件中以Uid:Gid:开头的行)。

阅读一些不错的Linux编程书,也许是旧的credentials(7)。还请阅读ALPsyscalls(2)execve(2)inode(7),以及与文件相关的path_resolution(7)的失败案例,例如system calls,{{3} }等(open(2)也是如此)。花时间仔细阅读 read(2)

  

我的问题是如何从/proc/.../maps文件中提取进程的权限?

您不能从该文件中提取此类信息。 /proc/1234/maps伪文件描述了进程1234的虚拟地址空间。在/proc/1234/status中提供了凭据(以及其他状态信息)。谈论流程的权限毫无意义。

答案 1 :(得分:0)

我不知道您到底想做什么,但是您的程序肯定没有做到。

这是您的程序的作用:

  • 打开/proc/1234/maps,其中1234是进程自己的PID。
  • 逐个读取此文件中的行并进行分析,将值记录在flags和其他变量中。
  • 根据从最后(匹配)行收集的flags的最终值打印信息。

所以:

  • 从任何意义上讲,这都不会“打印所有进程的PID”,因为您只查看单个进程。
  • 打印出的内容基于maps文件的最后一行。至少在x86_64上,这是vsyscall area,它包含代码,因此是可执行的,但不可写。

由于我不知道您要执行的程序,因此我不会提供修复程序的方法。说“拥有读写权限”是不完整的:对什么拥有权限?