2011-11-23 20 views
13

Yazdığım küçük bir linux çekirdek modülünün içinde verilen bir dosya tanıtıcısından bir dosyanın adını almam gerekiyor. Getting Filename from file descriptor in C numaralı belgede verilen çözümü denedim, ancak bazı nedenlerden dolayı, çöp değerlerini (çözümde belirtildiği gibi/proc/self/fd/NNN kullanarak) yazdırır. Nasıl yapabilirim?Bir çekirdek modülündeki bir dosya tanıtıcısından dosya adı nasıl alabilirim?

+0

[sys_readlink başarısız EFAULT - alternatif] olası kopyası (http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient

cevap

21

SYS_readlink'u arama - bu bağlantılardan biri okunduğunda procfs'un yaptığı aynı yöntemi kullanın. proc_pid_readlink() ve proc_fd_link() kodunda fs/proc/base.c ile başlayın. Verilen Geniş

, int fd ve (eğer bir başvuru almış olan) ilgilendiğiniz görevden bir struct files_struct *files, yapmak istediğiniz bir: kodunuzu takviye suyunun çalışıyorsa

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); 

bağlam (örn. bir syscall yoluyla çağrılır) ve dosya tanıtıcı geçerli işlemden, o zaman geçerli görev için current->files kullanabilirsiniz struct files_struct *.

+0

Güzel. İşe yaradı. Teşekkürler! Hızlı soru olsa da. 'Path_get' ve 'path_put' çağrılarının hangi amacı vardır? (Bunları kaldırmak, programımda çok fazla bir etkiye sahip olmadığı için)? Ayrıca, herhangi bir fikir neden sys_readlink 'çalışmaz? – Siddhant

+1

@Siddhant: "path_get()" ve "path_put()" çağrıları, doğruluk için gereklidir, çünkü onlar, yol üzerinde çalışmayı denediğinizde gitmeyecek şekilde yolu sabitler (tüm "struct path") içerir bir işaretçi, bir 'struct vfsmount' ve' struct dentry' için. – caf

+0

Aha. Tekrar teşekkürler! – Siddhant

İlgili konular