2012-07-09 34 views
9

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?

+0

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

+0

Có, tôi đã sửa tiêu đề. –

Trả lời

11

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

+2

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

4

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.

+1

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

+1

@ 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. –

+0

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

Các vấn đề liên quan