1
6
Để bảo vệ tài nguyên hệ thống đặc biệt bộ nhớ, khi ta sử dụng xong module trong một
đối tượng chia sẻ, thì giải phóng chúng. Hàm dlclose() sẽ đóng đối tượng chia sẻ:
int dlclose(void *handle);
Sử dụng giao diện dl
Để minh hoạ cách sử dụng dl,chúng ta quay lại thư viện xử lí lỗi, sử dụng một chương
trình khác như sau:
/*
* dltest.c
* Dynamically load liberr.so and call err_ret()
*/
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(void)
{
void *handle;
void (*errfcn)();
const char *errmsg;
FILE *pf;
handle = dlopen("liberr.so", RTLD_NOW);
if(handle == NULL) {
fprintf(stderr, "Failed to load liberr.so: %s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror();
errfcn = dlsym(handle, "err_ret");
if((errmsg = dlerror()) != NULL) {
fprintf(stderr, "Didn't find err_ret(): %s\n", errmsg);
exit(EXIT_FAILURE);
}
if((pf = fopen("foobar", "r")) == NULL)
errfcn("couldn't open foobar");
dlclose(handle);
return EXIT_SUCCESS;
}
Mã nguồn chương trình dltest.c
Biên dịch ví dụ trên bằng lệnh:
$ gcc -g -Wall dltest.c -o dltest -ldl
Như tacó thể thấy, chúng ta không liên kết dựa vào liberr hay liberr.h trong mã nguồn.
Tất cả truy cập tới liberr.so thông qua dl. Chạy chương trình bằng cách sau:
$ LD_LIBRARY_PATH=$(pwd) ./dltest
Nếu thành công thì ta nhận được kết quả như sau:
couldn’t open foobar: No such file or directory