我用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);
}
答案 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)和munmap
,mmap(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)。还请阅读ALP,syscalls(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
的最终值打印信息。所以:
maps
文件的最后一行。至少在x86_64上,这是vsyscall area,它包含代码,因此是可执行的,但不可写。由于我不知道您要执行的程序,因此我不会提供修复程序的方法。说“拥有读写权限”是不完整的:对什么拥有权限?