2

为了检索正在运行的程序的文件权限,我需要对kstat当前正在运行的程序做一个。然后我需要获取加载的 ELF 图像的绝对路径。

那可能吗?current->comm只记录没有路径的程序名。

或者还有什么其他方法可以做到?

4

4 回答 4

2

您可以readlink(2)使用指向 的路径/proc/self/exe,在您的情况下,这将是指向 ELF 的链接。元示例使用readlink(1)

$ readlink /proc/self/exe
/bin/readlink

据我所知,仅限 Linux。

于 2013-09-18T00:42:03.587 回答
0

文件系统在proc中返回此信息/proc/<pid>/exe,因此您需要执行类似的操作。

proc获取函数proc_exe_link中进程的路径fs/proc/base.c。此功能改编自proc_exe_link

char *get_current_proc_path(char *buf, int buflen)
{
    struct file *exe_file;
    char *result = ERR_PTR(-ENOENT);
    struct mm_struct *mm;

    mm = get_task_mm(current);
    if (!mm) {
        goto out;
    }
    down_read(&mm->mmap_sem);
    exe_file = mm->exe_file;
    if (exe_file) {
        get_file(exe_file);
        path_get(&exe_file->f_path);
    }
    up_read(&mm->mmap_sem);
    mmput(mm);
    if (exe_file) {
        result = d_path(&exe_file->f_path, buf, buflen);
        path_put(&exe_file->f_path);
        fput(exe_file);
    }

out:
    return result;
}

这会将路径放在某处buf(不一定是缓冲区的开头),并返回指向路径的指针。出错时,它将返回一个ERR_PTR,因此请检查指针是否有效IS_ERR

于 2015-05-12T05:38:21.767 回答
-1

你的意思是getcwd()?http://man7.org/linux/man-pages/man2/getcwd.2.html

#include <unistd.h>
char * getcwd(char * buf, size_t size);

- - - - - - - - - 编辑 - - - - - - - - - - -

你想检查另一个正在运行的程序的路径,你可以在 /proc/$PID/exe 中找到它:

ll /proc/$PID/exe

或者

ll /proc/$PID | grep exe

或者

readlink /proc/$PID/exe
于 2013-09-18T01:07:17.240 回答
-2
Table 1-5: Kernel info in /proc         .............................................................................. 
File        Content                                           
apm         Advanced power management info                    
buddyinfo   Kernel memory allocator information (see text)  (2.5)
bus         Directory containing bus specific information     
**cmdline**     Kernel command line                               

前任。

[root@localhost ~]# more /proc/364/cmdline
/usr/sbin/smbd
[root@localhost ~]# more /proc/364/common
/proc/364/common: No such file or directory
[root@localhost ~]# more /proc/364/comm
smbd
[root@localhost ~]#
于 2013-09-18T00:59:01.580 回答