2011-11-23 8 views
13

私は私が書いた小さなLinuxカーネルモジュール内、指定したファイル記述子からファイル名を取得する必要があります。私はGetting Filename from file descriptor in Cで与え溶液を試みたが、何らかの理由で、それは(溶液中で述べたよう/proc/self/fd/NNNreadlinkを使用して)ガベージ値を出力します。どうしたらいいですか?カーネルモジュール内のファイルディスクリプタからファイル名を取得するにはどうすればよいですか?

+0

[sys_readlinkが失敗する可能性があります。EFAULT - 代替](http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient

答えて

21

SYS_readlinkを呼び出さないでください - これらのリンクのいずれかが読み込まれたときprocfsが行うのと同じ方法を使用します。 proc_pid_readlink()proc_fd_link()のコードをfs/proc/base.cに開始してください。大まか

、あなたは(あなたがへの参照を取っている)に興味を持っているタスク、あなたがやりたいからint fdstruct files_struct *files与えられた:あなたのコードがPROCESS-で実行されている場合

char *tmp; 
char *pathname; 
struct file *file; 
struct path *path; 

spin_lock(&files->file_lock); 
file = fcheck_files(files, fd); 
if (!file) { 
    spin_unlock(&files->file_lock); 
    return -ENOENT; 
} 

path = &file->f_path; 
path_get(path); 
spin_unlock(&files->file_lock); 

tmp = (char *)__get_free_page(GFP_KERNEL); 

if (!tmp) { 
    path_put(path); 
    return -ENOMEM; 
} 

pathname = d_path(path, tmp, PAGE_SIZE); 
path_put(path); 

if (IS_ERR(pathname)) { 
    free_page((unsigned long)tmp); 
    return PTR_ERR(pathname); 
} 

/* do something here with pathname */ 

free_page((unsigned long)tmp); 

コンテキスト(例えばシステムコールを介して起動)とファイルディスクリプタは、現在のプロセスからのもので、その後、あなたは現在のタスクのstruct files_struct *ためcurrent->filesを使用することができます。

+0

ニース。それはうまくいった。ありがとう!クイック質問。 'path_get'と' path_put'の呼び出しはどのような目的のために役立ちますか?それらを削除することは私のプログラムにはあまり効果がありません。また、なぜ 'sys_readlink'が動作しないのでしょうか? – Siddhant

+1

@Siddhant: 'path_get()'と 'path_put(それが消えないように、あなたはそれで動作するようにしようとしている間、彼らはパスを固定するので)'コールは、正確に必要とされている(すべての '構造体PATH' containsは 'struct vfsmount'と' struct dentry'への一対のポインタです)。 – caf

+0

Aha。再度、感謝します! – Siddhant

関連する問題