Bộ nạp năng động chỉ làm thường xuyên cũ open(2)
và mmap(2)
cuộc gọi, và một bản đồ bộ nhớ bumps refcounts inode theo cùng một cách một fd mở không. Vì vậy, nếu bạn thực hiện thủ thuật thay thế tệp nguyên tử thông thường cho thư viện, hãy viết các thay đổi của bạn trong một bản sao mới của tệp và sau đó rename(2)
nó trên tên cũ, bất kỳ thứ gì được bắt đầu sau thời điểm đó sẽ nhận mã inode mới và nội dung mới, nhưng các chương trình đang chạy sẽ tiếp tục sử dụng inode cũ và nội dung cũ.
Nếu bạn sửa đổi thư viện tại chỗ, tự nhiên mọi chương trình được bắt đầu sau khi cuộc gọi write
sẽ nhận các thay đổi của bạn. Câu hỏi thú vị hơn là những gì xảy ra với các quá trình đã được ánh xạ. Câu trả lời có lẽ là "hệ thống sẽ không cho phép bạn làm điều đó" hoặc "không xác định, phụ thuộc vào các chi tiết của việc triển khai bộ nhớ cache của trang". Poking ngẫu nhiên tại triển khai Linux (đó là những gì tôi phải bàn giao): Trình nạp động glibc sử dụng MAP_DENYWRITE
cho tất cả các bản đồ thư viện được chia sẻ của nó, nhưng không được ghi lại nhưng âm thanh như nó có nghĩa là "làm cho tệp này không thể sửa đổi được trong khi ánh xạ tồn tại" . Tuy nhiên, tôi không thể tìm thấy bất cứ điều gì trong các nguồn hạt nhân làm cho MAP_DENYWRITE
làm bất kỳ điều gì; nó có thể là một di tích lịch sử hoặc một số như vậy.
Nó cũng sử dụng MAP_PRIVATE
. http://pubs.opengroup.org/onlinepubs/7908799/xsh/mmap.html nói rằng "Nó không được chỉ định cho dù sửa đổi đối tượng bên dưới được thực hiện sau khi ánh xạ MAP_PRIVATE được thiết lập có thể nhìn thấy thông qua ánh xạ MAP_PRIVATE." Vì vậy, bạn có thể hoặc không thể sửa đổi hình ảnh thư viện được chia sẻ bên dưới một quy trình đang chạy, tùy thuộc vào chi tiết của việc triển khai bộ nhớ cache của trang.
điều này không thực sự trả lời câu hỏi – zwol