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

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

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

$ <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, world\n&quot;;

18Β  struct flock lock;

19

20Β  if (argc != 2) {

21Β Β  fprintf(stderr, &quot;usage: %s file\n&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: %s\n&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: %s\n&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: %s\n&quot;,

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

46Β Β  (void)close(fd);

47Β Β Β return 1;

48Β Β }

49

50Β  /* Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» */

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

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