Tôi cần lấy tên của tệp từ một bộ mô tả tệp đã cho, bên trong mô-đun hạt nhân Linux nhỏ mà tôi đã viết. Tôi đã thử các giải pháp được đưa ra tại Getting Filename from file descriptor in C, nhưng vì một số lý do, nó in ra các giá trị rác (sử dụng readlink
trên /proc/self/fd/NNN
như đã đề cập trong giải pháp). Tôi làm nó như thế nào?Làm cách nào để lấy tên tệp từ bộ mô tả tệp bên trong mô-đun hạt nhân?
Trả lời
Không gọi SYS_readlink
- sử dụng cùng phương thức procfs
khi nào một trong các liên kết đó được đọc. Bắt đầu bằng mã trong proc_pid_readlink()
và proc_fd_link()
trong fs/proc/base.c
.
chung, đưa ra một int fd
và struct files_struct *files
từ công việc bạn đang quan tâm (mà bạn đã thực hiện một tham chiếu đến), bạn muốn làm:
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);
Nếu mã của bạn đang chạy trong process- ngữ cảnh (ví dụ: được gọi thông qua một syscall) và bộ mô tả tập tin là từ quá trình hiện tại, sau đó bạn có thể sử dụng current->files
cho nhiệm vụ hiện tại struct files_struct *
.
Tốt. Điều đó hiệu quả. Cảm ơn! Câu hỏi nhanh. Các cuộc gọi 'path_get' và' path_put' có mục đích gì (vì việc loại bỏ chúng không có nhiều ảnh hưởng đến chương trình của tôi)? Ngoài ra, bất kỳ ý tưởng tại sao 'sys_readlink' không hoạt động? – Siddhant
@Siddhant: Các cuộc gọi 'path_get()' và 'path_put()' là bắt buộc đối với tính chính xác, vì chúng ghim đường dẫn sao cho nó không biến mất trong khi bạn đang cố gắng làm việc với nó (tất cả đường dẫn 'struct' contains là một cặp con trỏ, tới 'struct vfsmount' và' struct dentry'). – caf
Aha. Cảm ơn một lần nữa! – Siddhant
- 1. Cách đọc/ghi tệp trong mô-đun hạt nhân Linux?
- 2. (Viết hạt nhân) Làm cách nào để sửa đổi bảng mô tả ngắt?
- 3. Lấy bộ mô tả tệp được phân bổ cao nhất
- 4. Làm cách nào để nhận luồng FILE * từ bộ mô tả tệp?
- 5. Cách lấy đường dẫn tệp bằng cách sử dụng bộ mô tả tệp trên Android?
- 6. Trợ giúp với các bộ mô tả tệp trong Unix
- 7. Cách lấy tệp mô tả trong node.js nếu bạn mở tệp bằng openSync
- 8. cách giữ mã hạt nhân bên trong tệp .cu riêng biệt ngoài tệp .cpp chính?
- 9. Bộ mô tả ổ cắm và tệp
- 10. Tải mô-đun hạt nhân trong hạt nhân Android
- 11. Cách mở lại một bộ mô tả tệp đã đóng
- 12. Cách lấy tên tệp của mô-đun __main__ bằng Python?
- 13. Làm cách nào để viết ký tự dòng mới vào bộ mô tả tệp bằng Python?
- 14. Lấy cấu hình từ ảnh hạt nhân Linux
- 15. Cách lấy tên tệp từ mục đích?
- 16. giải nén tệp HANDLE từ bộ mô tả tệp Windows hoặc từ FILE *
- 17. Cách truy cập Trình mô tả tệp của tệp mở
- 18. Làm cách nào để chuyển đổi một con trỏ tệp (FILE * fp) thành một bộ mô tả tệp (int fd)?
- 19. Có cách nào để tạo bộ mô tả tệp giả trong linux không?
- 20. Cách lấy tên tệp chỉ từ hộp thoại lưu tệp
- 21. Thay đổi kích thước bộ mô tả tệp trong httperf
- 22. Làm cách nào để chỉ lấy tên tệp trong bộ tiền xử lý?
- 23. Làm cách nào để sử dụng ioctl() để điều khiển mô-đun hạt nhân của tôi?
- 24. Tạo mảng nội bộ động bên trong hạt nhân OpenCL
- 25. Bạn sử dụng tên biến nào cho các bộ mô tả tệp?
- 26. bắc cầu giữa hai bộ mô tả tệp
- 27. cấp phát bộ nhớ bên trong hạt nhân CUDA
- 28. Làm thế nào để có được số lượng sử dụng từ mô-đun hạt nhân Linux?
- 29. Không thể ghi vào bộ nhớ hạt nhân qua mô-đun hạt nhân Linux (Ubuntu)
- 30. Cách lấy tên trang tính từ tệp XLS mà không tải toàn bộ tệp?
có thể trùng lặp của [sys_readlink không thành công EFAULT - thay thế] (http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient