Майкл Джонсон - Разработка приложений в среде Linux. Второе издание
- Название:Разработка приложений в среде Linux. Второе издание
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:2007
- Город:Москва
- ISBN:978-5-8459-1143-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание
Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.
Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Таблица 11.4. Расширенные атрибуты файла
Атрибут | Определение |
---|---|
EXT3_APPEND_FL |
Если файл открыт для записи, должен быть указан флаг O_APPEND . |
EXT3_IMMUTABLE_FL |
Файл не может быть модифицирован или удален ни одним пользователем, включая root. |
EXT3_NODUMP |
Файл должен быть проигнорирован командой dump. |
EXT3_SYNC_FL |
Файл должен обновляться синхронно, как если бы при открытии был указан флаг O_SYNC |
Поскольку расширенные атрибуты ext3 выходят за пределы стандартного интерфейса файловых систем, они не могут модифицироваться с помощью chmod()
, как все остальные атрибуты. Вместо этого используется ioctl()
. Вспомним, как определен вызов ioctl()
.
#include
#include
int ioctl(int fd, int request, void *arg);
Файл, атрибуты которого меняются, должен быть открыт, как для fchmod()
. Запрос (параметр request) на получение текущего состояния флагов — EXT3_IOC_GETFLAGS
, а для установки их — EXT3_IOC_SETFLAGS
. В обоих случаях arg
должен быть указателем на int
. Если используется EXT3_IOC_GETFLAGS
, то long
устанавливается в текущее значение программных флагов. Если применяется EXT3_IOC_SETFLAGS
, то новое значение файловых флагов берется из int
, на который указывает arg
.
Это дополнение и неизменяемые флаги могут быть изменены только пользователем root, поскольку это связано с операциями, которые может выполнять только root.
Другие флаги могут быть модифицированы либо пользователем root, либо владельцем файла.
Приведем пример небольшой программы, которая отображает флаги для любого файла, переданного в командной строке. Она работает только с файлами из файловой системы ext3 [48] В действительности это хорошо работает и на файловой системе ext2. Эти две файловые системы очень похожи (можно даже смонтировать систему ext3 на ext2), и представленные программы работают на обеих. Фактически, если в исходных тексте заменить 3 на 2, программы будут функционировать точно так же.
. Вызов ioctl()
завершится неудачей, если применить его к файлам из любой другой файловой системы.
1: /* checkflags.c */
2:
3: /* Для каждого имени файла, переданного в командной строке, отобразить
4: информацию об атрибутах этого файла в файловой системе ext3. */
5:
6: #include
7: #include
8: #include
9: #include
10: #include
11: #include
12: #include
13:
14: int main(int argc, const char **argv) {
15: const char **filename = argv + 1;
16: int fd;
17: int flags;
18:
19: /* Пройти по каждому имени файла, переданному в командной строке. Последний
20: указатель в argv[] равен NULL, поэтому такие циклы while() корректны. */
21: while(*filename) {
22: /* В отличие от нормальных атрибутов, атрибута ext3 можно опрашивать только
23: если есть файловый дескриптор (имя файла не годится).
24: Для выполнения запроса атрибутов ext3 нам не нужен доступ на запись,
25: поэтому O_RDONLY подойдет. */
26: fd = open(*filename, O_RDONLY);
27: if (fd<0) {
28: fprintf(stderr, "не открывается %s: %s\n", *filename,
29: strerror(errno));
30: return 1;
31: }
32:
33: /* Этот вызов получает атрибуты, и помещает их в flags */
34: if (ioctl(fd, EXT3_IOC_GETFLAGS, &flags)) {
35: fprintf(stderr, "ioctl завершился ошибкой на %s: %s\n", *filename,
36: strerror(errno));
37: return 1;
38: }
39:
40: printf("%s: ", *filename++);
41:
42: /* Проверить каждый атрибут, и отобразить сообщение для каждого,
43: который включен. */
44: if (flags & EXT3_APPEND_FL) printf("Append");
45: if (flags & EXT3_IMMUTABLE_FL) printf("Immutable");
46: if (flags & EXT3_SYNC_FL) printf("Sync");
47: if (flags & EXT3_NODUMP_FL) printf("Nodump");
48:
49: printf("\n");
50: close(fd);
51: }
52:
53: return 0;
54: }
Ниже приведена похожая программа, которая устанавливает расширенные атрибуты ext3 для указанного списка файлов. Первый параметр должен быть списком флагов, которые нужно установить. Каждый флаг представляется в списке в виде одной буквы: А — только для добавления (append only), I — неизменяемый (immutable), S — синхронизированный (sync), N — недампированный (nodump). Эта программа не модифицирует существующие флаги файла; она только устанавливает флаги, переданные в командной строке.
1: /* setflags.c */
2:
3: /* Первый параметр этой программы — строка, состоящая из
4: 0 (допускается пустая) или более букв из набора I, A, S,
5: N. Эта строка указывает, какие из атрибутов ext3 должны
6: быть включены для файлов, указанных в остальных
7: параметрах командной строки — остальные атрибуты выключаются
8: буквы обозначают соответственно: immutable, append-only, sync и nodump.
9:
10: Например, команда "setflags IN file1, file2" включает
11: флаги immutable и nodump для файлов file1 и file2, но отключает
12: флаги sync и append-only для этих файлов. */
13:
14: #include
15: #include
16: #include
17: #include
18: #include
19: #include
20: #include
21:
22: int main(int argc, const char **argv) {
23: const char **filename = argv + 1;
24: int fd;
25: int flags = 0;
26:
27: /* Убедиться, что указаны устанавливаемые флаги, вместе
28: с именами файлов. Позволить установить "0", как признак
29: того, что все флаги должны быть сброшены. */
30: if (argc<3){
31: fprintf(stderr, "Использование setflags: [0][I][A][S][N]"
32: "\n");
33: return 1;
34: }
35:
36: /* каждая буква представляет флаг; установить
37: флаг, которые указаны */
38: if (strchr(argv[1], 'I') ) flags |= EXT3_IMMUTABLE_FL;
39: if (strchr(argv[1], 'A') ) flags |= EXT3_APPEND_FL;
40: if (strchr(argv[1], 'S') ) flags |= EXT3_SYNC_FL;
41: if (strchr(argv[1], 'N') ) flags |= EXT3_NODUMP_FL;
42:
43: /* пройти по всем именам в argv[] */
44: while (*(++filename)) {
45: /* В отличие от нормальных атрибутов, атрибута ext3 можно опрашивать,
46: только если есть файловый дескриптор (имя файла не годится).
47: Для выполнения запроса атрибутов ext3 нам не нужен доступ на запись,
48: поэтому O_RDONLY подойдет. */
49: fd = open(*filename, O_RDONLY);
50: if (fd < 0) {
51: fprintf(stderr, "невозможно открыть %s:%s\n", *filename,
52: strerror(errno));
53: return 1;
54: }
55:
56: /* Установить атрибуты в соответствии с переданными
57: флагами. */
58: if (ioctl(fd, EXT3_IOC_SETFLAGS, &flags)) {
59: fprintf(stderr, "Сбой ioctl в %s:%s\n", *filename,
60: strerror(errno));
61: return 1;
62: }
63: close(fd);
64: }
65:
66: return 0;
67: }
Интервал:
Закладка: