Potrzebuję uzyskać nazwę pliku z danego deskryptora pliku, wewnątrz małego modułu jądra Linuxa, który napisałem. Próbowałem rozwiązania podanego pod Getting Filename from file descriptor in C, ale z jakiegoś powodu wypisuje wartości śmieci (przy użyciu readlink
na /proc/self/fd/NNN
, jak wspomniano w roztworze). Jak mogę to zrobić?Jak mogę uzyskać nazwę pliku z deskryptora pliku wewnątrz modułu jądra?
Odpowiedz
Nie dzwoń pod numer SYS_readlink
- używaj tej samej metody, którą robi procfs
po odczytaniu jednego z tych linków. Zacznij od kodu w proc_pid_readlink()
i proc_fd_link()
w fs/proc/base.c
.
Ogólnie, podać int fd
i struct files_struct *files
od zadania jesteś zainteresowany (które miały odniesienie do), chcesz zrobić:
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);
Jeśli kod jest uruchomiony w proces- kontekst (np. wywoływany przez syscall) i deskryptor pliku pochodzi z bieżącego procesu, możesz użyć current->files
dla bieżącego zadania struct files_struct *
.
Nice. To się udało. Dzięki! Szybkie pytanie. Do czego służą wywołania 'path_get' i' path_put' (ponieważ ich usunięcie nie ma większego wpływu na mój program)? Ponadto, każdy pomysł, dlaczego nie "sys_readlink" działa? – Siddhant
@Siddhant: Wywołania 'path_get()' i 'path_put()' są wymagane dla poprawności, ponieważ przypinają ścieżkę, aby nie zniknęła podczas próby pracy z nią (wszystkie ścieżki 'struct path' zawiera parę wskaźników, do 'struct vfsmount' i' struct dentry'). – caf
Aha. Dzięki jeszcze raz! – Siddhant
- 1. Jak mogę uzyskać nazwę pliku z żądania.FILES?
- 2. Jak uzyskać strumień FILE * z deskryptora pliku?
- 3. Jak uzyskać tymczasową nazwę pliku?
- 4. wymagają pliku wewnątrz modułu?
- 5. Jak mogę uzyskać nazwę pliku w Dart?
- 6. Jak mogę zasymulować brak deskryptora pliku?
- 7. Jak uzyskać nazwę pliku modułu __main__ w Pythonie?
- 8. Jak uzyskać nazwę otwartego pliku?
- 9. Jak uzyskać nazwę pliku DLL?
- 10. Jak uzyskać tylko nazwę pliku z przesyłaniem pliku Jersey
- 11. Jak uzyskać nazwę pliku z dyspozycji treści?
- 12. Jak dodać ścieżkę dołączania do pliku makefile modułu jądra?
- 13. Jak uzyskać ścieżkę do pliku za pomocą deskryptora pliku na urządzeniu z systemem Android?
- 14. @MultipartForm Jak uzyskać oryginalną nazwę pliku?
- 15. Docker: Ustaw nazwę kontenera wewnątrz pliku Dockerfile
- 16. Jak uzyskać nazwę pliku data.frame na liście?
- 17. PHAsset uzyskać oryginalną nazwę pliku
- 18. Jak uzyskać nazwę pliku wejściowego w MRjob
- 19. jak uzyskać tylko nazwę pliku bez ścieżki pliku?
- 20. Jak uzyskać pełną ścieżkę, podając nazwę pliku?
- 21. Jak mogę ustawić nazwę pliku w NSSavePanel?
- 22. Uzyskaj nazwę pliku z pliku wejściowego Angular2
- 23. Jak mogę uzyskać ikonę pliku?
- 24. Jak mogę uzyskać ConnectionString Nazwa pliku konfiguracyjnego
- 25. jak uzyskać nazwę pliku wywołującego, nazwę metody w pytonie
- 26. Pobierz nazwę pliku z QFile?
- 27. Jak uzyskać nazwę pliku z formularza przesyłania za pomocą jQuery?
- 28. Jak uzyskać nazwę pliku pobranego z Angular $ http?
- 29. Jak pobrać tylko nazwę pliku z okna dialogowego zapisywania pliku
- 30. jak uzyskać nazwę pliku wejściowego jako kolumna w kwerendzie kwarantanny
możliwy duplikat [sys_readlink nie działa EFAULT - alternatywa] (http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient