想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
2年前关闭。
我用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);
}
最佳答案
我要做的是打印所有可读写的进程的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)和munmap
,mprotect(2)等。
要以编程方式扫描目录(例如/proc/1234/fd/
甚至/proc/
),请在opendir(3)上循环后将readdir(3)与closedir
一起使用(您可能还会在具有的文件路径上使用stat(2)在某些情况下,您可以使用nftw(3)。
另请阅读Operating Systems: Three Easy Pieces以获取有关OS的广泛信息。
编辑后
我要做的是打印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
中提供了凭据(以及其他状态信息)。而且,谈论流程的权限是没有意义的。
关于c - 解析/proc/maps? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53139446/