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?
cevap
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 *
.
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
@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
Aha. Tekrar teşekkürler! – Siddhant
- 1. Dosya tanıtıcısından dosya adı alın
- 2. Windows'da bir dosya tanıtıcısından dosya yolu alma
- 3. Win32API - İşlem tanıtıcısından işlemin dosya adı nasıl alınır?
- 4. Dosya tanıtıcısından FILE * akışı nasıl alınır?
- 5. Dosya adı, dosya adı olmadan nasıl kurtulur?
- 6. Dosya adı dosya adından nasıl çıkarılır?
- 7. SSRS'de bir dosya adı nasıl dinamik çağırın
- 8. Python: Benzersiz bir dosya adı nasıl oluşturulur?
- 9. Linux çekirdek modülündeki dosyalar nasıl okunur/yazılır?
- 10. konsoldan okunan bir girdinin dosya adı veya dosya tam yolu
- 11. Geçici bir dosyayı nasıl açabilirim ve dosya adını nasıl alabilirim?
- 12. Dosya adında bir virgülle nasıl dosya okuyabilirim?
- 13. CordovaFile & CordovaFileTransfer. Doğru dosya adıyla doğru dosya adını nasıl alabilirim?
- 14. Android'de dosya yolunu nasıl alabilirim?
- 15. Çoklu dosya Powershell Modülündeki komut dosyaları arasındaki bağımlılıklar nasıl yönetilir?
- 16. Toplu İş: Yalnızca bir dosya ve dosya adı
- 17. iOS: dosya adı seçildikten sonra dosya gösteriliyor
- 18. genişletilmiş sınıfın dosya adı olsun.
- 19. Benzersiz dosya adı oluştur
- 20. MultipartMemoryStreamProvider: dosya adı?
- 21. Basename içermeyen bir dosya yolu
- 22. Python'da bir sınıf için dosya yolunu nasıl alabilirim?
- 23. Linux'ta bir dosya için yalnızca bir inode numarasını nasıl alabilirim?
- 24. ProjectItem dosya adı
- 25. Girdi dosya türünden dosya adı al Angular2
- 26. açık dosya bir unicode dosya adıyla mı?
- 27. servlet dosya yükleme dosya adı kodlaması
- 28. Dosya adı olmadan bir yol bulmak
- 29. Bir dosya adı için SVN deposunda arama
- 30. Log4j'de tarih içeren bir dosya adı
[sys_readlink başarısız EFAULT - alternatif] olası kopyası (http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient