Майкл Джонсон - Разработка приложений в среде Linux. Второе издание

Тут можно читать онлайн Майкл Джонсон - Разработка приложений в среде Linux. Второе издание - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство Вильямс, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Разработка приложений в среде Linux. Второе издание
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    978-5-8459-1143-8
  • Рейтинг:
    3.8/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание

Разработка приложений в среде Linux. Второе издание - описание и краткое содержание, автор Майкл Джонсон, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

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

Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)

Разработка приложений в среде Linux. Второе издание - читать книгу онлайн бесплатно, автор Майкл Джонсон
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Системный вызов fcntl()используется для регистрации уведомлений об обновлениях каталога. В главе 11 уже говорилось о том, что этот системный вызов принимает три аргумента. Первый аргумент — это интересующий файловый дескриптор, второй — это команда, которую необходимо выполнить fcntl(), а последний — это целое число, специфическое для этой команды. Для уведомлений каталогов первый аргумент является файловым дескриптором, относящимся к интересующему каталогу. Это единственный случай, при котором каталог следует открывать с помощью нормального системного вызова open()вместо opendir(). Командой регистрации уведомлений является F_NOTIFY, а последний аргумент определяет, какие типы событий вызывают отправку сигнала. Это должен быть один или несколько перечисленных ниже флагов, объединенных по логическому "ИЛИ".

DN_ACCESS Файл в каталоге, который читается.
DN_ATTRIB Права владения или доступа к файлу в каталоге были изменены.
DN_CREATE В каталоге создан новый файл (включая новые жесткие ссылки на уже существующие файлы).
DN_DELETE Файл удален из каталога.
DN_MODIFY Файл в каталоге был модифицирован (тип модификации — усечение).
DN_RENAME Файл в каталоге был переименован.

Для отмены уведомления о событии вызовите fcntl()с командой F_NOTIFYи последним аргументом, равным нулю.

Обычно уведомление каталога автоматически отменяется после передачи одного сигнала. Для эффективного уведомления каталога окончательный аргумент для fcntl()должен быть объединен операцией "ИЛИ" с DN_MULTISHOT, что вызывает отправку сигналов для всех подходящих событий до отмены уведомления.

По умолчанию для уведомления каталога передается SIGIO. Если приложение желает использовать для этого другой сигнал (например, для разных каталогов могут понадобиться разные сигналы), можно применить команду F_SETSIGв fcntl(), а в качестве последнего аргумента определить нужный сигнал. Если используется F_SETSIG(даже если установлен сигнал SIGIO), ядро также помещает файловый дескриптор на каталог в элементе si_fdаргумента обработчика сигналов siginfo_t [103] Это то же, что и метод, используемый для владения файлами (глава 13). , позволяя приложению узнать, какие из контролируемых каталогов обновились [104] Обработчик сигналов все еще следует регистрировать с помощью флага SA_SIGINFO , чтобы файловый дескриптор надлежащим образом получил доступ к сигналу. .

Если контролируется несколько каталогов и для всех каталогов выбран один сигнал, крайне необходимо использовать сигнал реального времени, чтобы убедиться, что ни одно из событий не затерялось.

Ниже приведена программа, использующая уведомление о смене каталога для вывода сообщений об удалении либо добавлении файлов в любые контролируемые ею каталоги (их количество указывается в командной строке). Она отказывается принять SIGRTMINпри смене каталога и использует si_fd, чтобы обнаружить, какой именно каталог был изменен. С целью предотвращения условий состязаний программа использует сигналы с очередизацией и блокирование сигналов. Сигнал может быть доставлен только один раз — при вызове sigsuspend()в строке 203. Это обеспечивает повторное сканирование каталога в случае внесения изменений в каталог во время его сканирования; иначе эти изменения останутся незамеченными. Использование сигналов с очередизацией разрешает любые изменения каталога во время работы программы; эти сигналы доставляется при каждом новом вызове sigsuspend(), гарантируя, что ничего не пропущено.

1: /* dirchange.с */

2:

3: #define _GNU_SOURCE

4: #include

5: #include

6: #include

7: #include

8: #include

9: #include

10: #include

11: #include

12:

13: /* Для сохранения имен файлов из каталога используется связный

14: список. Поле exists служит для хранения служебной информации

15: при проверке изменений. */

16: struct fileInfo {

17: char * name;

18: struct fileInfo * next;

19: int exists;

20: };

21:

22: /* Это глобальный массив. Он отображает файловые дескрипторы на пути

23: каталогов, сохраняет список файлов в каталоге и предоставляет

24: обработчику сигналов место для отображения того факта, что каталог

25: должен сканироваться повторно. Последний элемент имеет path,

26: равный NULL, обозначающий конец массива. */

27:

28: struct directoryInfo {

29: char * path;

30: int fd;

31: int changed;

32: struct fileInfo * contents;

33: } * directoryList;

34:

35: /* Это никогда не возвращает пустой список; любой каталог содержит,

36: по крайней мере, "." и ".." */

37: int buildDirectoryList(char * path, struct fileInfo ** listPtr) {

38: DIR * dir;

39: struct dirent * ent;

40: struct fileInfo * list = NULL;

41:

42: if (!(dir = opendir(path))) {

43: perror("opendir");

44: return 1;

45: }

46:

47: while ((ent = readdir(dir))) {

48: if (!list) {

49: list = malloc(sizeof(*list));

50: list->next = NULL;

51: *listPtr = list;

52: } else {

53: list->next = malloc(sizeof(*list));

54: list = list->next;

55: }

56:

57: list->name = strdup(ent->d_name);

58: }

59:

60: if (errno) {

61: perror("readdir");

62: closedir(dir);

63: return 1;

64: }

65:

66: closedir(dir);

67:

68: return 0;

69: }

70:

71: /* Сканирует путь каталога в поисках изменений предыдущего

72: содержимого, как указано *listPtr. Связанный список

73: обновляется новым содержимым, и выводятся сообщения,

74: описывающие произошедшие изменения. */

75: int updateDirectoryList(char * path, struct fileInfo ** listPtr) {

76: DIR * dir;

77: struct dirent * ent;

78: struct fileInfo * list = *listPtr;

79: struct fileInfo * file, * prev;

80:

81: if (!(dir = opendir(path))) {

82: perror("opendir");

83: return 1;

84: }

85:

86: for (file = list; file; file = file->next)

87: file->exists = 0;

88:

89: while ((ent = readdir(dir))) {

90: file = list;

91: while (file && strcmp(file->name, ent->d_name))

92: file = file->next;

93:

94: if (!file) {

95: /* новый файл, добавить его имя в список */

96: printf("%s создан в %s\n", ent->d_name, path);

97: file = malloc(sizeof(*file));

98: file->name = strdup(ent->d_name);

99: file->next = list;

100: file->exists = 1;

101: list = file;

102: } else {

103: file->exists = 1;

104: }

105: }

106:

107: closedir(dir);

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Майкл Джонсон читать все книги автора по порядку

Майкл Джонсон - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Разработка приложений в среде Linux. Второе издание, автор: Майкл Джонсон. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x