Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过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)munmapmprotect(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/

10-16 20:26