日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

linux导出路径path,Linux kernel 绝对路径之d_path篇【转】

發(fā)布時(shí)間:2025/5/22 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux导出路径path,Linux kernel 绝对路径之d_path篇【转】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一. d_path函數(shù)說明

d_path 是內(nèi)核提供的根據(jù)dentry和vfsmount獲取絕對路徑函數(shù)

此函數(shù)有2個版本,以內(nèi)核版本2.6.25為分界

extern char *d_path(const struct path *, char *, int);

extern char * d_path(struct dentry *, struct vfsmount *, char *, int);

結(jié)構(gòu)體path原型如下

struct path {

struct vfsmount *mnt;

struct dentry *dentry;

};

僅僅是對 vfsmount 和 dentry進(jìn)行了簡單封裝而已

二.獲取進(jìn)程路徑

char* get_absolute_path(struct task_struct * task)

{

char * ret_ptr = NULL;

char * tpath = NULL ;

struct vm_area_struct * vma = NULL;

struct path base_path;

tpath = (char*)kmalloc(512, 0);

if(NULL == tpath || NULL == task)

{

return NULL;

}

memset(tpath,' ',512);

task_lock(task);

if(task->mm && task->mm->mmap)

{

vma = task->mm->mmap;

}

else

{

task_unlock(task);

kfree(tpath);

return NULL;

}

/*

* 取得 path(a struct含dentry和vfsmount),參考自 fs/proc/base.c中proc_exe_link

*/

while(vma)

{

if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file)

{

base_path = vma->vm_file->f_path;

break;

}

vma = vma->vm_next;

}

task_unlock(task);

/*

* 調(diào)用 d_path, 得到絕對路徑

*/

ret_ptr = d_path(&base_path, tpath, 512);

return ret_ptr;

}

三. 獲取文件路徑

根據(jù)文件描述符獲取文件路徑主要是從task_struct中取得文件的dentry和文件所在文件系統(tǒng)vfsmount

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)

base_path = current->files->fdt->fd[fd]->f_path;

#else

base_dp = current->files->fdt->fd[fd]->f_path.dentry;

vfsmnt_ptr = current->files->fdt->fd[fd]->f_path.mnt;

然后就可以使用d_path,得到絕對路徑了

————————————————

版權(quán)聲明:本文為CSDN博主「nehc」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/cenziboy/article/details/8761621

總結(jié)

以上是生活随笔為你收集整理的linux导出路径path,Linux kernel 绝对路径之d_path篇【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。