Tôi đang cố gắng tạo một mô-đun hạt nhân Linux, hỗ trợ các hoạt động mở, đóng, đọc và ghi. Vì vậy, tôi muốn đăng ký các chức năng này thông qua struct file_operations, tuy nhiên tôi không thể tìm thấy mục 'close' trong cấu trúc. Tôi nghĩ rằng tôi nên sử dụng 'phát hành' thay vì 'đóng', nhưng tôi tự hỏi tại sao tên là 'phát hành' và không 'đóng'?Tại sao hàm đóng được gọi là phát hành trong `struct file_operations` trong hạt nhân Linux?
Trả lời
Bởi vì tệp có thể được mở nhiều lần, khi bạn đóng bộ mô tả, chỉ trên lần gọi gần cuối cùng cho tham chiếu cuối cùng cho tệp gọi ra bản phát hành. Vì vậy, có một sự khác biệt giữa đóng và phát hành.
phát hành: gọi vào lúc đóng cửa cuối cùng (2) của tập tin này, tức là khi File-> f_count đạt 0. Mặc dù định nghĩa là trở về int, giá trị trả về được bỏ qua bởi VFS (xem fs/file_table. c: __ fput()). more
Hãy lưu ý rằng mmap tăng tham chiếu đến một tệp như vậy; mở, mmap, đóng trình tự không kết quả với việc phát hành ngay lập tức được gọi nhưng khi munmap được gọi. – auselen
Tôi đã có một sự nhầm lẫn tương tự. Perreal là chính xác trong bản phát hành đó không được gọi khi đóng được gọi. Dưới đây là một đoạn trích từ cuốn sách Linux Device Drivers 3rd edition:
int (*flush) (struct file *);
Các hoạt động tuôn ra được gọi khi một quá trình đóng bản sao của một bộ mô tả tập tin cho một thiết bị; nó sẽ thực hiện (và chờ đợi) bất kỳ hoạt động nổi bật nào trên thiết bị. Điều này không được nhầm lẫn với hoạt động fsync do các chương trình người dùng yêu cầu. Hiện tại, lệnh xả chỉ được sử dụng trong mã hệ thống tệp mạng (NFS). Nếu tuôn ra là NULL, nó đơn giản là không được gọi.
int (*release) (struct inode *, struct file *);
Thao tác này được gọi khi cấu trúc tệp được phát hành. Giống như mở, phát hành có thể bị thiếu.
Lưu ý rằng bản phát hành không được gọi mỗi lần quá trình gọi gần. Bất cứ khi nào một cấu trúc tệp được chia sẻ (ví dụ, sau một ngã ba hoặc một bản dup), bản phát hành sẽ không được gọi cho đến khi tất cả các bản sao được đóng lại. Nếu bạn cần xóa dữ liệu đang chờ xử lý khi bất kỳ bản sao nào được đóng, bạn nên thực hiện phương thức tuôn ra.
Nếu một quá trình đơn có hai bộ mô tả tập tin đề cập đến cùng một tệp, gọi 'close()' trên mỗi bộ mô tả tập tin sẽ gọi 'release' hai lần. – Asblarf
@ Asblarf Điều đó có ý nghĩa vì một đối tượng "struct file *" riêng biệt sẽ được duy trì bên trong hạt nhân cho mỗi bộ mô tả tệp được mở bởi một tiến trình. –
Chính xác, đó là những gì tôi phát hiện ra bằng cách xem xét kỹ hơn những gì 'struct file *' đã đại diện. – Asblarf
- 1. Đối số "struct file_operations" là gì?
- 2. Linux mutexes hạt nhân
- 3. Người gọi chức năng trong hạt nhân Linux
- 4. Giờ hiện hành trong hạt nhân Linux 2.6
- 5. Bảng gọi hệ thống trong hạt nhân Linux ở đâu?
- 6. distro cho phát triển hạt nhân linux
- 7. Tôi muốn đóng góp cho hạt nhân Linux
- 8. về typecheck trong hạt nhân linux
- 9. Tại sao hạt nhân được cho là đang trong không gian địa chỉ quy trình?
- 10. Tại sao Hạt Java được gọi là "đậu"?
- 11. Nhân Linux: copy_from_user - struct với con trỏ
- 12. Tạo biểu đồ cuộc gọi tĩnh cho hạt nhân Linux
- 13. __init có nghĩa là gì trong mã hạt nhân Linux?
- 14. nhiệm vụ lặp lại hrtimer trong hạt nhân Linux
- 15. Mối quan hệ giữa hệ điều hành Linux và hạt nhân là gì?
- 16. Chức năng aio hạt nhân linux
- 17. Gọi hạt nhân OpenCL từ một hạt nhân OpenCL khác
- 18. Tại sao tôi cần phải biên dịch lại mô-đun hạt nhân vmware sau khi nâng cấp hạt nhân Linux?
- 19. Các kỹ thuật gỡ lỗi hạt nhân Linux hiện tại
- 20. Tác vụ định kỳ trong mô-đun hạt nhân Linux
- 21. Cách đọc/ghi tệp trong mô-đun hạt nhân Linux?
- 22. Tổ chức tiêu đề hạt nhân Linux
- 23. Tải mô-đun hạt nhân trong hạt nhân Android
- 24. Thực hiện các cuộc gọi/bẫy hệ thống trong nguồn hạt nhân Linux
- 25. Hạt nhân CUDA có thể gọi hàm cublas không?
- 26. Không thể ghi vào bộ nhớ hạt nhân qua mô-đun hạt nhân Linux (Ubuntu)
- 27. Tắt (linux) linux từ hạt nhân-không gian
- 28. Kiểu mã hóa hạt nhân Linux
- 29. Truyền DMA trong trình điều khiển hạt nhân Linux PCIE
- 30. Sự khác biệt b/w __raw_readl/__ raw_writel và readl/writel trong hạt nhân Linux là gì?
Vì vậy, bạn đang hỏi tại sao nó được gọi là 'phát hành' chứ không phải 'đóng'? – cnicutar
Có, tôi đã sửa tiêu đề. –