Читаем Разработка приложений в среде Linux. Второе издание полностью

handle должен представлять собой дескриптор, возвращенный функцией dlopen(), a symbol должен содержать строку с завершающим NULL, которая именует искомый символ. Функция dlsym() возвращает адрес определенного вами символа или NULL в случае возникновения неустранимой ошибки. Если вы будете знать, что NULL не является правильным адресом символа (например, при поиске адреса функции), можно выполнить проверку на наличие ошибок, посмотрев, возвращает ли она NULL. Однако в общем случае некоторые символы могут иметь нулевые значения и быть равными NULL. Тогда вам нужно будет узнать, не возвращает ли функция dlerror() ошибку. Поскольку функция dlerror() возвращает ошибку только один раз, возвращая после этого NULL, вы должны организовать свой код следующим образом.

/* удалить любое состояние ошибки, которое еще не было прочитано */

dlerror();

p = dlsym(handle, "this_symbol");

if ((error = dlerror()) != NULL) {

 /* обработка ошибки */

}

Так как функция dlsym() возвращает void *, вам необходимо использовать приведение типов, чтобы компилятор С не выдавал сообщений об ошибках. Если вы сохраняете указатель, возвращенный функцией dlsym(), сохраните его в переменной того типа, который вы хотите использовать, и выполните приведение типа во время вызова функции dlsym(). Не сохраняйте результат в переменной void *; вам придется выполнять приведение типов каждый раз во время ее использования.

Функция dlclose() закрывает библиотеку.

void * dlclose(void * handle);

Функция dlclose() проверяет счетчик обращений, который увеличивался на единицу при каждом повторном вызове функции dlopen(), и если он равен нулю, она закрывает библиотеку. Этот счетчик обращений позволяет библиотекам применять функции dlopen() и dlclose() для произвольных объектов, не беспокоясь о том, что код, в котором производится вызов, уже открыл какие-либо из этих объектов.

<p>27.1.1. Пример</p>

В главе 8 был представлен пример использования обычной разделяемой библиотеки. Библиотеку libhello.so, которую нам удалось создать, можно загружать во время выполнения. Программа loadhello загружает libhello.so динамически и вызывает функцию print_hello, которая находится в библиотеке.

Ниже показан код loadhello.с.

 1: /* loadhello.с */

 2:

 3: #include

 4: #include

 5: #include

 6:

 7: typedef void (*hello_function) (void);

 8:

 9: int main(void) {

10:  void * library;

11:  hello_function hello;

12:  const char * error;

13:

14:  library = dlopen("libhello.so", RTLD_LAZY);

15:  if (library == NULL) {

16:   fprintf (stderr, "He удается открыть libhello.so: %s\n",

17:    dlerror());

18:   exit(1);

19:  }

20:

21:  /* Хотя в данном случае мы знаем, что символ print_hello никогда

22:   * не должен быть равен NULL, при поиске произвольных символов

23:   * все происходит иначе. Поэтому вместо проверки результата функции dlsym()

24:   * мы показываем пример проверки кода, возвращаемого функцией dlerror().

25:   */

26:  dlerror();

27:  hello = dlsym(library, "print_hello");

28:  error = dlerror();

29:  if (error) {

30:   fprintf(stderr, "He удается найти print_hello: %s\n", error);

31:   exit(1);

32:  }

33:

34:  (*hello)();

35:  dlclose(library);

36:  return 0;

37: }

<p>Глава 28</p><p>Идентификация и аутентификация пользователей</p>

В модели безопасности Linux для идентификации пользователей и групп используются числа, однако люди отдают предпочтение именам. Имена, наряду с другой важной информацией, сохраняются в двух системных базах данных.

<p>28.1. Преобразование идентификатора в имя</p>
Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных