Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде 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] , позволяя приложению узнать, какие из контролируемых каталогов обновились [104] .

103

Это то же, что и метод, используемый для владения файлами (глава 13).

104

Обработчик сигналов все еще следует регистрировать с помощью флага

SA_SIGINFO
, чтобы файловый дескриптор надлежащим образом получил доступ к сигналу.

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

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

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

1: /* dirchange.с */

2:

3: #define _GNU_SOURCE

4: #include <dirent.h>

5: #include <errno.h>

6: #include <fcntl.h>

7: #include <signal.h>

8: #include <stdio.h>

9: #include <stdlib.h>

 10: #include <string.h>

 11: #include <unistd.h>

 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:

Поделиться:
Популярные книги

Машенька и опер Медведев

Рам Янка
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Машенька и опер Медведев

Волк 5: Лихие 90-е

Киров Никита
5. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Волк 5: Лихие 90-е

Приручитель женщин-монстров. Том 4

Дорничев Дмитрий
4. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 4

Приручитель женщин-монстров. Том 2

Дорничев Дмитрий
2. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 2

Кодекс Охотника. Книга VIII

Винокуров Юрий
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VIII

Бальмануг. (Не) Любовница 1

Лашина Полина
3. Мир Десяти
Фантастика:
юмористическое фэнтези
попаданцы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 1

Курсант: Назад в СССР 10

Дамиров Рафаэль
10. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 10

Путь (2 книга - 6 книга)

Игнатов Михаил Павлович
Путь
Фантастика:
фэнтези
6.40
рейтинг книги
Путь (2 книга - 6 книга)

Live-rpg. эволюция-4

Кронос Александр
4. Эволюция. Live-RPG
Фантастика:
боевая фантастика
7.92
рейтинг книги
Live-rpg. эволюция-4

Адепт. Том второй. Каникулы

Бубела Олег Николаевич
7. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.05
рейтинг книги
Адепт. Том второй. Каникулы

Восход. Солнцев. Книга IV

Скабер Артемий
4. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга IV

Краш-тест для майора

Рам Янка
3. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
эро литература
6.25
рейтинг книги
Краш-тест для майора

Последний реанорец. Том I и Том II

Павлов Вел
1. Высшая Речь
Фантастика:
фэнтези
7.62
рейтинг книги
Последний реанорец. Том I и Том II

Измена. Право на семью

Арская Арина
Любовные романы:
современные любовные романы
5.20
рейтинг книги
Измена. Право на семью