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

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

Жанры

Linux программирование в примерах
Шрифт:

$ echo hello, world > myfile /* Создать файл */

$ ls -l myfile /* Отобразить права доступа */

– rw-r--r-- 1 arnold devel 13 Apr 3 17:11 myfile

$ chmod g+s myfile /* Добавить бит setgid */

$ ls -l myfile /* Показать новые права доступа */

– rw-r-Sr-- 1 arnold devel 13 Apr 3 17:11 myfile

Бит права на исполнение группой должен быть оставлен сброшенным.

S
показывает, что бит setgid установлен, но что бит права на исполнение — нет; если бы были установлены оба бита, была бы использована строчная буква
s
.

Комбинация установленного бита setgid и сброшенного бита права на исполнение группой обычно бессмысленно. По этой причине, она была выбрана разработчиками System V для обозначения «использования обязательного блокирования». И в самом деле, добавления этого бита достаточно, чтобы заставить коммерческую систему Unix, такую как Solaris, использовать блокировку файлов.

На системах GNU/Linux несколько другая история. Для обязательных блокировок файл должен иметь установленный бит setgid, но этого одного недостаточно. Файловая система, содержащая файл, также должна быть смонтирована с опцией

mand
в команде
mount
.

Мы уже рассмотрели файловые системы, разделы диска, монтирование и команду mount, главным образом, в разделе 8.1 «Монтирование и демонтирование файловых систем». Мы можем продемонстрировать обязательную блокировку с помощью небольшой программы и файловой системой для тестирования на гибком диске. Для начала, вот программа:

1 /* ch14-lockall.c --- Демонстрация обязательной блокировки. */

2

3 #include <stdio.h> /* для fprintf, stderr, BUFSIZ */

4 #include <errno.h> /* объявление errno */

5 #include <fcntl.h> /* для флагов open */

6 #include <string.h> /* объявление strerror */

7 #include <unistd.h> /* для ssize_t */

8 #include <sys/types.h>

9 #include <sys/stat.h> /* для mode_t */

10

11 int

12 main(int argc, char **argv)

13 {

14 int fd;

15 int i, j;

16 mode_t rw_mode;

17 static char message[] = "hello, world\n";

18 struct flock lock;

19

20 if (argc != 2) {

21 fprintf(stderr, "usage: %s file\n", argv[0]);

22 exit(1);

23 }

24

25 rw_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; / * 0644 */

26 fd = open(argv[1], O_RDWR|O_TRUNC|O_CREAT|O_EXCL, rw_mode);

27 if (fd < 0) {

28 fprintf(stderr, "%s: %s: cannot open for read/write: %s\n",

29 argv[0], argv[1], strerror(errno));

30 (void)close(fd);

31 return 1;

32 }

33

34 if (write(fd, message, strlen(message)) != strlen(message)) {

35 fprintf(stderr, "%s: %s: cannot write: %s\n",

36 argv[0], argv[1], strerror(errno));

37 (void)close(fd);

38 return 1;

39 }

40

41 rw_mode |= S_ISGID; /*
добавить бит обязательной блокировки */

42

43 if (fchmod(fd, rw_mode) < 0) {

44 fprintf(stderr, "%s: %s: cannot change mode to %o: %s\n",

45 argv[0], argv[1], rw_mode, strerror(errno));

46 (void)close(fd);

47 return 1;

48 }

49

50 /* заблокировать файл */

51 memset(&lock, '\0', sizeof(lock));

52 lock.l_whence = SEEK_SET;

53 lock.l_start = 0;

54 lock.l_len =0; /* блокировка всего файла */

55 lock.l_type = F_WRLCK; /* блокировка записи */

56

57 if (fcntl(fd, F_SETLK, &lock) < 0) {

58 fprintf(stderr, "%s: %s: cannot lock the file: %s\n",

59 argv[0], argv[1], strerror(errno));

60 (void)close(fd);

61 return 1;

62 }

63

64 pause;

65

66 (void)close(fd);

67

68 return 0;

69 }

Программа устанавливает права доступа и создает файл, указанный в командной строке (строки 25 и 26). Затем она записывает в файл некоторые данные (строка 34). Строка 41 добавляет к правам доступа бит setgid, а строка 43 изменяет их. (Системный вызов

fchmod
обсуждался в разделе 5.5.2 «Изменение прав доступа:
chmod
и
fchmod
».)

Строки 51–55 устанавливают

struct flock
для блокировки всего файла, а затем блокировка осуществляется реально в строке 57. Выполнив блокировку, программа засыпает, используя системный вызов
pause
(см. раздел 10.7 «Сигналы для межпроцессного взаимодействия»). После этого программа закрывает дескриптор файла и завершается. Вот расшифровка с комментариями, демонстрирующая использование обязательной блокировки файлов:

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

Газлайтер. Том 16

Володин Григорий Григорьевич
16. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 16

Мусорщик

Поселягин Владимир Геннадьевич
3. Наемник
Фантастика:
боевая фантастика
космическая фантастика
8.55
рейтинг книги
Мусорщик

Князь

Мазин Александр Владимирович
3. Варяг
Фантастика:
альтернативная история
9.15
рейтинг книги
Князь

Измена. Свадьба дракона

Белова Екатерина
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Измена. Свадьба дракона

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

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

Хозяин Стужи 2

Петров Максим Николаевич
2. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Хозяин Стужи 2

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

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

Возвращение Безумного Бога 2

Тесленок Кирилл Геннадьевич
2. Возвращение Безумного Бога
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Возвращение Безумного Бога 2

Золото Советского Союза: назад в 1975. Книга 2

Майоров Сергей
2. Золото Советского Союза
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Золото Советского Союза: назад в 1975. Книга 2

Изгой Проклятого Клана. Том 6

Пламенев Владимир
6. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 6

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

Винокуров Юрий
38. Кодекс Охотника
Фантастика:
фэнтези
боевая фантастика
попаданцы
юмористическое фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVIII

Газлайтер. Том 25

Володин Григорий Григорьевич
25. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 25

Третий. Том 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 4

Идеальный мир для Демонолога 9

Сапфир Олег
9. Демонолог
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Демонолога 9