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

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

Читать бесплатно Linux программирование в примерах - Роббинс Арнольд. Жанр: Интернет год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

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

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

Роббинс Арнольд читать все книги автора по порядку

Роббинс Арнольд - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Linux программирование в примерах отзывы

Отзывы читателей о книге Linux программирование в примерах, автор: Роббинс Арнольд. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*