2009-11-30 1 views

답변

2

더 이상 직접 링크가 없습니다. proc_exe_link() 함수는 파일을 매핑하는 작업에서 첫 번째 실행 가능 vma를 찾음으로써이 정보를 얻습니다. 당신이 좋아하는 뭔가 current을 위해 그렇게 할 것 : 음

struct dentry *dentry = NULL; 
struct vfsmount *mnt = NULL; 
struct vm_area_struct * vma; 

down_read(&current->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(&current->mm->mmap_sem); 

if (dentry) { 
    /* inode is dentry->d_inode */ 
} 
0

, 그것은 물론, 손실되지 않습니다. 최근의 리눅스 커널에서는 그것을 추적하는 것이 약간 복잡합니다. 당신에게 지금

mm = get_task_mm(task); 

다음

exe_file = get_mm_exe_file(mm); 

: 최근의 리눅스 커널에 대한

, 'task_struct 구조체'의 포인터로, 당신은 첫째로는 '구조체 mm_struct'를 얻을 필요 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; 
} 
입니다.