GIÁO TRÌNH HỆ ĐIỀU HÀNH UNIX - LINUX - Trang 161

1
6

Một cách để sử dụng thư viện dùng chung là nạp chúng tự động mỗi khi chạy không

giống như nhũng thư viện liên kết và nạp một cách tự động. Ta có thể sử dụng giao diện dl
(dynamic loading) vì nó tạo sự linh hoạt cho lập trình viên hay người dùng.

Giả sử ta đang tạo một ứng dụng sử lý đồ hoạ. Trong ứng dụng, ta biểu diễn dữ liệu ở

một dạng không theo chuẩn nhưng lại thuận tiện cho ta xử lý, và ta cần có nhu cầu chuyển
dữ liệu đó ra các định dạng thông dụng đã có (số lượng các định dạng này có thể có hàng
trăm loại) hoặc đọc dữ liệu từ các định dạng mới này vào để xử lý. Để giải quyết vấn đề
này ta có thể sử dụng giải pháp là thư viện. Nhưng khi có thêm một định dạng mới thì ta lại
phải biên dịch lại chương trình. Đây lại là một điều không thích hợp lắm. Khả năng sử dụng
thư viện động sẽ giúp ta giải quyết vấn đề vừa gặp phải. Giao diện dl cho phép tạo ra giao
diện (các hàm) đọc và viết chung không phụ thuộc vào định dạng của file ảnh. Để thêm
hoặc sửa các định dạng của file ảnh ta chỉ cần viết thêm một module để đảm nhận chức
năng đó và báo cho chương trình ứng dụng biết là có thêm một module mới bằng cách chỉ
cần thay đổi một file cấu hình trong một thư mục xác định nào đó.

Giao diện dl (cũng đơn thuần được xây dựng như một thư viện - thư viện libdl) chứa

các hàm để tải (load), tìm kiếm và giải phóng (unload) các đối tượng chia sẻ. Để sử dụng
các hàm này ta thêm file <dlfcn.h> vào phần #include vào trong mã nguồn, và khi dịch thì
liên kết nó với thư viện libdl bằng cách sử dụng tham số và tên –ldl trong dòng lệnh dịch.

dl cung cấp 4 hàm xử lí các công việc cần thiết để tải, sử dụng và giải phóng đối tượng

dùng chung.

Truy cp đối tượng chia s

Để truy cập một đối tượng chia sẻ, dùng hàm dlopen() có đặc tả như sau:

void *dlopen(const char *filename, int flag);

dlopen() truy cập đối tượng chia sẻ bằng filename và bằng cờ. Filename có thể là đường

dẫn đầy đủ, tên file rút gọn hay NULL. Nếu là NULL dlopen() mở chương trình đang chạy,
đó là chương trình của bạn, nếu filename là đường dẫn dlopen() mở file đó, nếu là tên rút
gọn dlopen() sẽ tìm trong vị trí sau để tìm file:

$LD_ELF_LiBRARY_PATH,

$LD_LIBRARY_PATH, /etc/ld.so.cache, /usr/lib, và /lib.

Cờ có thể là RTLD_LAZY, có nghĩa là các kí hiệu (symbol) hay tên hàm từ đối tượng

truy cập sẽ được tìm mỗi khi chúng được gọi, hoặc cờ có thể là RTLD_NOW, có nghĩa tất
cả kí hiệu từ đối tượng truy cập sẽ được tìm trước khi hàm dlopen() trả về. dlopen() trả điều
khiển tới đối tượng truy nhâp nếu nó tìm thấy từ filename hay trả về giá trị NULL nếu
không tìm thấy.
S dng đối tượng chia s

Trước khi có thể sử dụng mã nguồn trong thư viện ta phải biết đang tìm cái gì và tìm ở

đâu. Hàm dlsym() sẽ giúp điều đó:
void *dlsym(void *handle, char *symbol);

dlsym() tìm kí hiệu hay tên hàm trong truy cập và trả lại con trỏ kiểu void tới đối tượng

hay NULL nếu không thành công.
Kim tra li

Hàm dlerror() sẽ giúp ta kiểm tra lỗi khi sử dụng đối tượng truy cập động:

const char *dlerror(void);

Nếu một trong các hàm lỗi, dlerror() trả về thông báo chi tiết lỗi và gán giá trị NULL

cho phần bị lỗi.

Gii phóng đối tượng chia s