Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 132

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

ΠžΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ flock() ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

β€’ Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ flock() являСтся Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ; ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ΠΈ ΠΈΡΠΏΠΎΡ€Ρ‚ΠΈΡ‚ΡŒ Π±Π΅Π· всяких сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Ρ„Π°ΠΉΠ», Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ flock().

β€’ Π‘локируСтся вСсь Ρ„Π°ΠΉΠ». НСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ части Ρ„Π°ΠΉΠ»Π°.

β€’ Π’ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Ρ„Π°ΠΉΠ», Π½Π΅ влияСт Π½Π° Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован. (Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это с fcntl(), ΠΏΡ€ΠΈ использовании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ для чтСния для получСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния, ΠΈΠ»ΠΈ для записи для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ записи.)

β€’ ΠΠ΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Π° дСскрипторов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠΎΠ²ΠΌΠ΅ΡΡ‚Π½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Для удалСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ любой ΠΈΠ· Π½ΠΈΡ…. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ fcntl(), ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ‚ явного разблокирования, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π΅ удаляСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ всС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ дСскрипторы Ρ„Π°ΠΉΠ»Π°.

β€’ ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ лишь ΠΎΠ΄Π½Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ flock(); ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² flock() с двумя Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ измСняСт Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ.

β€’ ΠΠ° систСмах GNU/Linux Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ flock() ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ нСзависимы ΠΎΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ fcntl(). МногиС коммСрчСскиС систСмы Unix Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ flock() Π² Π²ΠΈΠ΄Π΅ Β«ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈΒ» ΠΏΠΎΠ²Π΅Ρ€Ρ… fcntl(), Π½ΠΎ ΠΈΡ… сСмантика различаСтся.

ΠœΡ‹ Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ flock() Π² Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Π΅ сСмантика Π½Π΅ такая гибкая ΠΈ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½Π΅ стандартизована POSIX. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π΅Π΅ Π² GNU/Linux осущСствляСтся Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ обСспСчСниСм, написанным для старых систСм BSD Unix.

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•. Бправочная страница GNU/Linux flock(2) ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ flock() Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ для смонтированных ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ fcntl() Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ Ρƒ вас достаточно новая вСрсия Linux ΠΈ сСрвСр NFS ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²

14.2.4. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ коммСрчСских систСм Unix ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»ΠΎΠ². ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ лишь с fcntl(). ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π° контролируСтся установками ΠΏΡ€Π°Π² доступа Ρ„Π°ΠΉΠ»Π°, Π² частности, ΠΏΡƒΡ‚Π΅ΠΌ добавлСния ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Π±ΠΈΡ‚Π° setgid с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ chmod.

$ 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 Β«Π‘ΠΈΠ³Π½Π°Π»Ρ‹ для мСТпроцСссного взаимодСйствия»). ПослС этого ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ дСскриптор Ρ„Π°ΠΉΠ»Π° ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ. Π’ΠΎΡ‚ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ° с коммСнтариями, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ использованиС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²:

$ fdformat /dev/fd0 /* Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΈΠΉ диск */

Double -sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.

Formatting ... done

Verifying ... done

$ /sbin/mke2fs /dev/fd0 /* Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму Linux */

/* ...мноТСство Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ... */

$ su /* Π‘Ρ‚Π°Ρ‚ΡŒ root, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ mount */

Password: /* ΠŸΠ°Ρ€ΠΎΠ»ΡŒ Π½Π΅ отобраТаСтся */

# mount -t ext2 -ΠΎ mand /dev/fd0 /mnt/floppy /* Π‘ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΈΠΉ

диск, с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ */

# suspend /* ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ root */

[1]+ Stopped su

$ ch14-lockall /mnt/floppy/x & /* Ѐоновая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° */

[2] 23311 /* содСрТит Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ */

$ ls -l /mnt/floppy/x /* ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„Π°ΠΉΠ» */

-rw-r-Sr-- 1 arnold devel 13 Apr 6 14:23 /mnt/floppy/x

$ echo something > /mnt/floppy/x /* ΠŸΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» */

bash2: /mnt/floppy/x: Resource temporarily unavailable

 /* ВозвращаСтся ошибка */

$ kill %2 /* Π—Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ */

$ /* ΠΠ°ΠΆΠ°Ρ‚ΡŒ ENTER */

[2]- Terminated ch14-lockall /mnt/floppy/x /* ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° */

$ echo something > /mnt/floppy/x /* Новая ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° измСнСния Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ */

$ fg /* Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ root */

su

# umount /mnt/floppy /* Π”Π΅ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΈΠΉ диск */

# exit /* Π Π°Π±ΠΎΡ‚Π° с ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ root Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π° */

$

Пока выполняСтся ch14-lockall, ΠΎΠ½Π° Π²Π»Π°Π΄Π΅Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, пСрСнаправлСния Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ch14-lockall Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ, ΠΈ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° достигаСт Ρ†Π΅Π»ΠΈ. Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅, ΠΏΠΎΠ΄ GNU/Linux Π΄Π°ΠΆΠ΅ root Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Ρ„Π°ΠΉΠ»Π°.

НСмного ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡΡΡŒ Π² сторону, Π³ΠΈΠ±ΠΊΠΈΠ΅ диски ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΈΡΠΏΡ‹Ρ‚Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ стСнд для изучСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнты, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΌΠΈ систСмами. Если Π²Ρ‹ сдСлаСтС Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° Π³ΠΈΠ±ΠΊΠΎΠΌ дискС, это вряд Π»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ катастрофичСским, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ экспСримСнтированиС с Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌΠΈ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ТСстких дисках Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ рискованно.