2012-08-27 25 views
5

Nếu tôi sử dụng dlopen trên cùng một tệp lib/hai lần trong cùng một ứng dụng chạy, nó sẽ mang lại cùng một xử lý trong cả hai trường hợp? Có bất kỳ sự bảo đảm nào cho điều này không (một thử nghiệm ngắn cho thấy nó ít nhất là trên hộp của tôi)?Liệu dlopen có thể xử lý cùng một lệnh cho hai cuộc gọi với cùng một tệp không?

Tôi hiện đang phát xung quanh với một hệ thống plugin nhỏ (không tò mò) và nếu có một số loại bảo đảm cho hành vi được quan sát này, tôi có thể sử dụng địa chỉ này làm chìa khóa cho plugin để tránh tải trùng lặp.

Trả lời

8

Có. Man page dlopen(3) linux nói:

If the same library is loaded again with dlopen(), the same file 
    handle is returned. The dl library maintains reference counts for 
    library handles, so a dynamic library is not deallocated until 
    dlclose() has been called on it as many times as dlopen() 
    has succeeded on it. 

BTW, trên các hệ thống Linux, bạn có thể dlopen rất nhiều (nhiều hàng chục ngàn) của các thư viện chia sẻ, như ví dụ của tôi manydl.c chứng minh. Giới hạn chính là không gian địa chỉ. Vì vậy, thực tế, không làm phiền về dlclose-công cụ là có thể.

(trừ khi dlopen-ed bạn chia sẻ các thư viện có tốn nhiều nhà xây dựng hoặc destructor chức năng kỳ lạ hoặc tài nguyên)

gia tăng trong tháng 12 năm 2017:

Chú ý rằng những gì có liên quan là chuỗi đường dẫn chính xác thông qua đến dlopen. Vì vậy, nếu bạn sử dụng "./foo.so""././foo.so" (hoặc "../foosymlink.so" trong đó foosymlink.so là liên kết tượng trưng đến foo.so) các tay cầm dlopen-ed khác nhau và trong một số trường hợp hành vi lạ của hai trường hợp của thư viện được chia sẻ đó có thể xảy ra.

+1

.. và tôi chỉ đọc trang người đàn ông này, tại sao tôi cũng không đọc đoạn này? Hmpf .. tốt, cảm ơn bạn không có ít hơn để trả lời câu hỏi ngu ngốc của tôi :) – mageta

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