2013-07-05 23 views
40

Tôi có một chương trình ánh xạ khá ít (100) tệp có dung lượng lớn từ 10-100MB mỗi tệp. Tôi cần tất cả chúng được lập bản đồ cùng một lúc.Tôi có cần giữ một tệp mở sau khi gọi mmap trên đó không?

Hiện tại tôi đang gọi open, sau đó là mmap ở đầu chương trình, theo sau là munmapclose ở cuối.

Thường thì tôi phải điều chỉnh giới hạn tệp đang mở chạy ulimit -n trước khi chạy chương trình.

Câu hỏi là tôi có thực sự cần giữ các tệp mở hay không hoặc openmmapclose thực hiện một số xử lý dữ liệu lớn sau đó munmap khi tôi bị phạt.

Trang hướng dẫn sử dụng mmap dường như không rõ ràng đối với tôi trên trang này.

Trả lời

46

Không, ít nhất không phải trên Linux, việc đóng tệp là không tốt.

The manual page nêu rõ:

Mặt khác, đóng bộ mô tả tập tin không unmap khu vực.

Đối với tính di động, tôi cũng đã kiểm tra các POSIX manual, nó nói điều tương tự (mặc dù thậm chí rõ ràng hơn):

Các mmap() chức năng bổ sung thêm một tài liệu tham khảo bổ sung cho các tập tin liên quan đến việc bộ mô tả tệp fildes không bị xóa bởi sau() trên bộ mô tả tệp đó. Tham chiếu này bị xóa khi không có ánh xạ nào khác cho tệp.

+0

lý do tại sao 'proc//fd' không chứa thông tin về tệp mmapped? Có phải vì 'mmap' là' syscall', vì vậy các fds này có cấu trúc dữ liệu của hạt nhân không? _asking cho một người bạn_ – Paschalis