Видео ролики бесплатно онлайн

Смотреть 365 видео

Официальный сайт flashgamer 24/7/365

Смотреть видео бесплатно


dementiy 14.05.10 03:06 # +0
Молодец и плюсик Вам! С удовольствием прочитал, а завтра обязательно попробую. Может у кого-нибудь возникнет такой вопрос: как я понимаю тип glob_t расположен в библиотеке glob.h, а что именно он из себя представляет (целый тип, а может структуру)? И еще один вопрос, библиотеки glob.h и dlfcn.h уже присутствуют в системе или их надо ставить отдельно?
KblCb 14.05.10 03:22 # +-1
Это C. Здесь тип как правило и есть структура. Оба заголовка присутствуют в glibc, а вот стоят ли они в вашей системе это уже вопрос.
digiwhite 14.05.10 06:47 # +1
Так откройте заголовочный файл и посмотрите.
digiwhite 14.05.10 08:13 # +2
Вместо (*print)() можно просто писать print(), дабы повысить читаемость.
kstep 15.05.10 06:10 # +0
Никогда раньше не видел, чтобы «globbing» переводили как «универсализация». Хотя по словарю именно так, вроде. Сказывается изучение всего по англоязычным мануалам, да?
digiwhite 15.05.10 11:40 # +1
Ну можно и "динамическое связывание" назвать. Универсализация в общем-то тоже отражает суть, если рассматривать в контексте того, что происходит загрузка "постороннего" кода в адресное пространство приложения.
digiwhite 15.05.10 11:41 # +0
Ну т.е. присоединение некоторого частного к общему.
predator 15.05.10 20:02 # +0
Нет, читал книгу на русском. Просто статью писал уже задолго после этого. Возможно, что этот процесс называется по-другому. Книги уже нет под рукой =(
predator 15.05.10 20:36 # +0
Not enough memory for universalization

отсюда и перевел как универсализация
inst 18.05.10 23:26 # +0
Если не секрет, что за книга?
predator 05.06.10 19:58 # +0
Разработка приложений в среде Linux
Кто автор не помню
inst 06.06.10 10:30 # +0
Спасибо.
hate 15.05.10 18:12 # +0
это не плагины. это "а сейчас мы загрузим в адресное пространство весь шлак из папки".
для плагинов должна быть инфраструктура регистрации/дерегистрации, какая-либо информация about, взаимодействие друг с другом. всё это инфраструктурные вещи, которые хотелось бы видеть, но где они?
predator 15.05.10 19:57 # +0
ну вот и займись этим
digiwhite 16.05.10 18:36 # +0
ИМХО все это зависит от конкретных задач уже.

14.05.10 01:40 predator

CodingСоздание плагинов на C

Недавно заинтересовался тем, как создаются плагины для программ. Мне нравится язык C, поэтому я в первую очередь решил найти решение для него. В посте расскажу о принципах реализации и о такой вещи как универсализация.

Листинг main.c, в котором содержится основная программа:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <string.h>
#include <glob.h>

typedef void (*print_function)(void);

int errfn(const char * pathname, int theerr) {
        fprintf(stderr, "Ошибка при доступе к %s: %s\n", pathname,
                        strerror(theerr));
        return 0;
}

int
main(int argc, char **argv) {
        glob_t result;
        void * lib;
        print_function print;
        int rc, flags = 0, i;
        const char * error;
       
        rc = glob("plugins/*.so", flags, errfn, &result);
       
        if (rc == GLOB_NOSPACE) {
                fprintf(stderr, "Not enough memory for universalization\n");
                exit(1);
        }
       
        if (!result.gl_pathc) {
                fprintf(stderr, "No plugins found\n");
        } else {
                puts("List of plugins:");
                for (i = 0; i < result.gl_pathc; i++) {
                        puts(result.gl_pathv[i]);
                        lib = dlopen(result.gl_pathv[i], RTLD_LAZY);
                        if (lib == NULL) {
                                fprintf(stderr, "Cannot open: %s\n", dlerror());
                                exit(2);
                        }
                       
                        dlerror();
                        print = dlsym(lib, "print");
                        error = dlerror();
                        if (error) {
                                fprintf(stderr, "Cannot find \"print\": %s\n", error);
                                exit(3);
                        }
                       
                        print();
                        dlclose(lib);
                }
                rc = 0;
        }
        globfree(&result);
       
       
        return (EXIT_SUCCESS);
}


Теперь разберем, что здесь понаписано.

#include <dlfcn.h>

Для использования библиотеки, с помощью которой мы будем подключать динамические библиотеки (читать плагины) во время выполнения программы.
А сейчас пару слов про универсализацию. Каждый человек который работает в консоли знает что означают * и ? при написании имени файла. Так вот, универсализация это процесс поиска файлов попадающих под заданный шаблон и заголовочный файл

#include <glob.h>

позволяет нам это делать в нашей программе.

typedef void (*print_function)(void);

Создаем тип указателя на функцию, которую будем вызывать из плагина.

1
2
3
4
5
int errfn(const char * pathname, int theerr) {
        fprintf(stderr, "Ошибка при доступе к %s: %s\n", pathname,
                        strerror(theerr));
        return 0;
}

Функция обрабатывающая ошибки универсализации. В данном случае просто выводит сообщение об ошибке. При возвращении из этой функции нуля ошибка считается обработанной и универсализация продолжается, иначе выполнение прерывается.

1
2
3
4
5
6
7
glob_t result; // результат универсализации
void * lib; // указатель на библиотеку-плагин
print_function print; // указатель на функцию плагина
int rc, // результат универсализации
flags = 0, // флаги универсализации
i; // вспомогательная переменная
const char * error; // текст ошибки при поиски символов в библиотеке


rc = glob("plugins/*.so", flags, errfn, &result);

Ищем файлы в папке plugins относительно текущей папки программы. Результат занисится в result.

1
2
3
4
if (rc == GLOB_NOSPACE) {
        fprintf(stderr, "Not enough memory for universalization\n");
        exit(1);
}

Проверяем хватило ли места в памяти.
Далее, мы проходимся циклом по всем файлам, которые нашли.

lib = dlopen(result.gl_pathv[i], RTLD_LAZY);

Пытаемся открыть библиотеку. Параметр RTLD_LAZY отвечает за процесс поиска всех символов в библиотеке. В данном случае она не будет производиться при открытии библиотеки. Если вы будете открывать большие библиотеки рекомендую использовать именно этот параметр т.к. в другом случае может снизиться скорость работы.

1
2
3
4
if (lib == NULL) {
        fprintf(stderr, "Cannot open: %s\n", dlerror());
        exit(2);
}

Проверяем на ошибки.

1
2
dlerror();
print = dlsym(lib, "print");

Очищаем прежнее содержание функции dlerro() и пытаемся найти в библиотеке символ print (в данном случае нашу функцию).

1
2
3
4
5
error = dlerror();
if (error) {
        fprintf(stderr, "Cannot find \"print\": %s\n", error);
        exit(3);
}

Опять проверяем на ошибки.

1
2
print();
dlclose(lib);

Если все нормально мы наконец можем вызвать нужную нам функцию и закрыть библиотеку.

globfree(&result);

Освобождаем память занятую при универсализации.

Листинг hello_world.c, который и станет нашим плагином:
1
2
3
4
5
#include <stdio.h>

void print(void) {
        printf("Hello, World!\n");
}

Ну тут думаю все должно быть понятно.

Makefile к main.c:
1
2
prog.out : main.c
        gcc -o prog.out main.c -ldl


Makefile к hello_world.c:
1
2
3
4
5
hello_world.so : hello_world.o
        gcc -g -shared -o hello_world.so hello_world.o -lc

hello_world.o : hello_world.c
        gcc -fPIC -Wall -g -c hello_world.c


Вот и всё =)


Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 133)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 2589 из 203 городов)
            Топ пользователей Топ блогов
            welinux.ru

            В хорошем качестве hd видео

            Онлайн видео бесплатно


            Смотреть русское с разговорами видео

            Online video HD

            Видео скачать на телефон

            Русские фильмы бесплатно

            Full HD video online

            Смотреть видео онлайн

            Смотреть HD видео бесплатно

            School смотреть онлайн