为了检索正在运行的程序的文件权限,我需要对kstat
当前正在运行的程序做一个。然后我需要获取加载的 ELF 图像的绝对路径。
那可能吗?current->comm
只记录没有路径的程序名。
或者还有什么其他方法可以做到?
为了检索正在运行的程序的文件权限,我需要对kstat
当前正在运行的程序做一个。然后我需要获取加载的 ELF 图像的绝对路径。
那可能吗?current->comm
只记录没有路径的程序名。
或者还有什么其他方法可以做到?
您可以readlink(2)
使用指向 的路径/proc/self/exe
,在您的情况下,这将是指向 ELF 的链接。元示例使用readlink(1)
:
$ readlink /proc/self/exe
/bin/readlink
据我所知,仅限 Linux。
文件系统在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
。
你的意思是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
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 ~]#