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

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

Жанры

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

Троан Эрик В.

Шрифт:

29: того, что все флаги должны быть сброшены. */

30: if (argc<3){

31: fprintf(stderr, "Использование setflags: [0][I][A][S][N]"

32: "<filenames>\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: }

11.4. Манипулирование содержимым каталогов

Вспомните, что компоненты каталогов (имена файлов) — это ни что иное, как указатели на дисковые информационные узлы (on-disk inodes); почти вся важная информация, касающаяся файла, хранится в его inode. Вызов

open
позволяет процессу создавать компоненты каталогов, которые являются обычными файлами, но для создания файлов других типов и для манипулирования компонентами каталогов могут понадобиться другие функции. Функции, которые позволяют создавать, удалять и выполнять поиск каталогов, описаны в главе 14; файлы сокетов — в главе 17. В настоящем разделе раскрываются символические ссылки, файлы устройств и FIFO.

11.4.1. Создание входных точек устройств и именованных каналов

Процессы создают файлы устройств и именованных каналов в файловой системе с помощью вызова

mknod
.

#include <fcntl.h>

#include <unistd.h>

int mknod(const char *pathname, mode_t mode, dev_t dev);

pathname
это имя файла, который нужно создать,
mode
— это и режим доступа (который модифицируется текущим
umask
), и тип нового файла (
S_IFIFO
,
S_IFBLK
,
S_IFCHR
). Последний параметр,
dev
, содержит старший (major) и младший (minor) номера создаваемого устройства. Тип устройства (символьное или блочное) и старший номер устройства сообщают ядру, какой драйвер устройств отвечает за операции с этим файлом устройства. Младший номер используется внутри драйвером устройства, чтобы различать отдельные устройства среди многих, которыми он управляет. Только пользователю root разрешено создавать файлы устройств; именованные же каналы могут создавать все пользователи.

Заголовочный файл

<sys/sysmacros.h>
представляет три макроса для манипулирования значениями типа
dev_t
. Макрос
makedev
принимает старшие номера в первом аргументе, младшие — во втором и возвращает значение
dev_t
, ожидаемое
mknod
. Макросы
major
и
minor
принимают значение типа
dev_t
в качестве единственного аргумента и возвращают, соответственно, старший и младший номер устройства.

Программа

mknod
, доступная в Linux, предоставляет пользовательский интерфейс к системному вызову
mknod
(подробности см. в
man 1 mknod
). Ниже приведена упрощенная реализация
mknod
для иллюстрации системного вызова
mknod
. Следует отметить, что программа создает файл с режимом доступа 0666 (предоставляя право на чтение и запись всем пользователям) и зависит от системной установки umask процесса для получения прав доступа.

 1: /* mknod.с */

 2:

 3: /* Создать устройство или именованный канал, указанный в командной строке.

 4: См. подробности о параметрах командной строки

 5: на man-странице mknod(1). */

 6:

 7: #include <errno.h>

 8: #include <stdio.h>

 9: #include <stdlib.h>

10: #include <string.h>

11: #include <sys/stat.h>

12: #include <sys/sysmacros.h>

13: #include <unistd.h>

14:

15: void usage(void) {

16: fprintf (stderr, "использование: mknod <путь> [b | с | u | p]"

17: "<старший> <младший>\n");

18: exit(1);

19: }

20:

21: int main(int argc, const char **argv) {

22: int major = 0, minor = 0;

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

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Хозяйка дома в «Гиблых Пределах»

Нова Юлия
Любовные романы:
любовно-фантастические романы
5.75
рейтинг книги
Хозяйка дома в «Гиблых Пределах»

Фиктивный брак

Завгородняя Анна Александровна
Фантастика:
фэнтези
6.71
рейтинг книги
Фиктивный брак

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Держать удар

Иванов Дмитрий
11. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Держать удар

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

По дороге на Оюту

Лунёва Мария
Фантастика:
космическая фантастика
8.67
рейтинг книги
По дороге на Оюту

Мастер 5

Чащин Валерий
5. Мастер
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Мастер 5

Не лечи мне мозги, МАГ!

Ордина Ирина
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.00
рейтинг книги
Не лечи мне мозги, МАГ!

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

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

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Неудержимый. Книга XXI

Боярский Андрей
21. Неудержимый
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неудержимый. Книга XXI