在Linux v0.11 task_struct
中有一个executable
成员m_inode *
。我正在寻找类似的东西。
exec / execve系统调用是否将此信息存储在任何位置,或者在加载到内存时是否丢失?
答案 0 :(得分:2)
没有像这样的直接链接了。 proc_exe_link()
函数通过查找映射文件的任务中的第一个可执行vma来获取此信息。您可以使用以下内容为current
执行此操作:
struct dentry *dentry = NULL;
struct vfsmount *mnt = NULL;
struct vm_area_struct * vma;
down_read(¤t->mm->mmap_sem);
vma = current->mm->mmap;
while (vma) {
if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file)
break;
vma = vma->vm_next;
}
if (vma) {
mnt = mntget(vma->vm_file->f_path.mnt);
dentry = dget(vma->vm_file->f_path.dentry);
}
up_read(¤t->mm->mmap_sem);
if (dentry) {
/* inode is dentry->d_inode */
}
答案 1 :(得分:0)
当然,它并没有丢失。就在最近的Linux内核中,跟踪它有点复杂。
对于最近的Linux内核,使用'struct task_struct'指针,首先需要通过以下方式获取'struct mm_struct':
mm = get_task_mm(task);
然后
exe_file = get_mm_exe_file(mm);
现在你有了指向exec文件的'struct file'指针,使用'struct file',你可以通过以下方式得到它的inode:
struct inode *inode = file->f_path.dentry->d_inode;
BTW,get_mm_exe_file()的定义是
struct file *get_mm_exe_file(struct mm_struct *mm)
{
struct file *exe_file;
/* We need mmap_sem to protect against races with removal of
* VM_EXECUTABLE vmas */
down_read(&mm->mmap_sem);
exe_file = mm->exe_file;
if (exe_file)
get_file(exe_file);
up_read(&mm->mmap_sem);
return exe_file;
}