【问题标题】:Parsing /proc/maps? [closed]解析/proc/maps? [关闭]
【发布时间】:2018-11-04 09:40:16
【问题描述】:

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

这是我遇到问题的代码的 sn-p:

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);
}      

【问题讨论】:

  • 也许将您的printf() 放入循环中?
  • 即使进行了编辑,问题仍然不清楚并且显示出很多混乱。一个进程没有权限(但它确实有credentials(7) ...)
  • 花几天时间阅读更多关于 Linux 和操作系统的信息。我的回答提供了一些参考资料(其中大部分都可以免费下载,但您需要很多天才能阅读)。你一直很困惑(一个进程没有权限!)

标签: c file parsing process proc


【解决方案1】:

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

process 是一些operating system 提供的抽象。谈论“可读”进程(或“可写”进程)或具有“读取”权限或“写入”权限的进程是没有意义的,因为它大约是file system permissions。进程不是文件,其/proc/1234/ 目录只是内核提供的对该进程的视图。一个进程正在使用file descriptors 访问文件(您可能会扫描它的/proc/1234/fd/ 目录)。

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

要更改其虚拟地址空间,Linux 进程将使用诸如execve(2)(为新程序初始化新的虚拟地址空间)、mmap(2)munmapmprotect(2) 等系统调用。 .

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

另请阅读Operating Systems: Three Easy Pieces 以全面了解操作系统。

编辑后

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

这没有任何意义。 进程没有权限,但它确实有 credentials(7)(它定义了允许进程访问哪些文件)。您可以解析/proc/1234/status 以找到pid 1234 进程的凭据(特别是该伪文件中以Uid:Gid: 开头的行)。

阅读一些不错的 Linux 编程书籍,也许是旧的 ALP。另请阅读syscalls(2)execve(2)inode(7)path_resolution(7) 以及与文件相关的system calls 的失败案例,例如open(2)read(2) 等...(还有errno(3))。花点时间仔细阅读proc(5)

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

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

【讨论】:

  • 对不起,我的意思是我想打印具有读写权限的进程的 PID
  • 对什么文件有读写权限?通过什么文件描述符?
  • 我已经编辑了我的问题,我希望这将使我想要做的事情更加清晰。很抱歉造成混乱。
  • 即使进行了编辑,您仍会感到困惑。您应该阅读有关 Linux 编程的更多信息。
【解决方案2】:

我不知道你到底想做什么,但你的程序肯定不这样做。

这是你的程序的作用:

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

所以:

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

我不会提供修复您的程序的方法,因为我不知道您想要它做什么。说“有读写权限”是不完整的:权限是什么?

【讨论】:

  • 我已经编辑了我的问题,我希望这将使我想要做的事情更加清晰。很抱歉造成混乱。
  • 即使进行了编辑,问题也不清楚,您(OP)仍然感到困惑。
  • @user9042207 您仍在询问“进程的权限”,但没有定义您的意思。如果您仍然遇到问题,您应该提出一个新问题,在其中解释您想要什么。
猜你喜欢
  • 2010-11-26
  • 2016-11-28
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 2010-09-10
相关资源
最近更新 更多