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

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 dng giao din 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ã ngun 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