`
Читать книги » Книги » Компьютеры и Интернет » Интернет » Linux программирование в примерах - Роббинс Арнольд

Linux программирование в примерах - Роббинс Арнольд

Перейти на страницу:

$ <b>echo hello, world &gt; myfile</b> /* Создать файл */

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

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

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

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

-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 &lt;stdio.h&gt; /* для fprintf(), stderr, BUFSIZ */

4  #include &lt;errno.h&gt; /* объявление errno */

5  #include &lt;fcntl.h&gt; /* для флагов open() */

6  #include &lt;string.h&gt; /* объявление strerror() */

7  #include &lt;unistd.h&gt; /* для ssize_t */

8  #include &lt;sys/types.h&gt;

9  #include &lt;sys/stat.h&gt; /* для 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[] = &quot;hello, worldn&quot;;

18  struct flock lock;

19

20  if (argc != 2) {

21   fprintf(stderr, &quot;usage: %s filen&quot;, 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 &lt; 0) {

28   fprintf(stderr, &quot;%s: %s: cannot open for read/write: %sn&quot;,

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, &quot;%s: %s: cannot write: %sn&quot;,

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) &lt; 0) {

44   fprintf(stderr, &quot;%s: %s: cannot change mode to %o: %sn&quot;,

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

46   (void)close(fd);

47   return 1;

48  }

49

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

51  memset(&amp;lock, '', 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, &amp;lock) &lt; 0) {

58   fprintf(stderr, &quot;%s: %s: cannot lock the file: %sn&quot;,

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 «Сигналы для межпроцессного взаимодействия»). После этого программа закрывает дескриптор файла и завершается. Вот расшифровка с комментариями, демонстрирующая использование обязательной блокировки файлов:

Перейти на страницу:

Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Linux программирование в примерах - Роббинс Арнольд, относящееся к жанру Интернет. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.

Комментарии (0)