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

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

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

 long f_bfree;    /* число свободных Π±Π»ΠΎΠΊΠΎΠ² Π² Ρ„.с. */

 long f_bavail;   /* свободныС Π±Π»ΠΎΠΊΠΈ, доступныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ */

 long f_files;    /* ΠΎΠ±Ρ‰Π΅Π΅ число индСксов Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС */

 long f_ffree;    /* свободных индСксов Π² Ρ„.с. */

 fsid_t f_fsid;   /* id Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы */

 long f_namelen;  /* максимальная Π΄Π»ΠΈΠ½Π° ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² */

 long f_spare[6]; /* запас для дальнСйшСго */

};

Поля Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ полям Π² struct statvfs. По ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π² GLIBC 2.3.2 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ POSIX statvfs() ΠΈ fstatvfs() ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°ΠΌΠΈ Π²ΠΎΠΊΡ€ΡƒΠ³ statfs() ΠΈ fstatfs() соотвСтствСнно, копируя значСния ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ разновидности структуры Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠΌ использования statfs() ΠΈΠ»ΠΈ fstatfs() являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹. Π―Π΄Ρ€ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ нСпосрСдствСнно. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅Ρ‚ поля f_flag с опциями монтирования, Π½Π΅Ρ‚ нСобходимости ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΡΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму для нахоТдСния Π½ΡƒΠΆΠ½ΠΎΠΉ. (Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, для заполнСния ΠΎΠΏΡ†ΠΈΠΉ монтирования statfvs() Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΡΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Ρ„Π°ΠΉΠ», имя ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ содСрТится Π² path ΠΈΠ»ΠΈ fd. Ѐункция statfs() Π½Π΅ нуТдаСтся Π² этом, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° Π½Π΅ прСдоставляСт свСдСний ΠΎΠ± опциях монтирования.)

Π•ΡΡ‚ΡŒ Π΄Π²Π° нСудобства Π² использовании этих Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ½ΠΈ спСцифичны для Linux. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ‡Π°ΡΡ‚ΡŒ свСдСний ΠΈΠ· struct statvfs отсутствуСт Π² struct statfs, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠ· Π½ΠΈΡ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„Π»Π°Π³ΠΈ (f_flag) ΠΈ число доступных индСксов (f_favail). (ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ statvfs() Linux приходится Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΠΈ монтирования ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… источников, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ /etc/mtab, ΠΈ ΠΎΠ½Π° Β«Ρ„Π°Π±Ρ€ΠΈΠΊΡƒΠ΅Ρ‚Β» ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для Ρ‚Π΅Ρ… ΠΏΠΎΠ»Π΅ΠΉ struct statvfs, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния нСдоступны.)

Одно ΠΏΠΎΠ»Π΅ struct statfs заслуТиваСт особого замСчания. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ f_type, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ Ρ‚ΠΈΠΏ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ являСтся магичСским числом Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½ΠΎΠΉ ΠΈΠ· супСрблока. Бправочная страница statfs(2) прСдоставляСт список ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСм ΠΈ ΠΈΡ… магичСскиС числа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² ch08-statfs.c. (Π£Π²Ρ‹, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° #include Π½Π΅Ρ‚.)

1   /* ch08-statfs.с --- дСмонстрация statfs Linux */

2

3   /* Π—ΠΠœΠ•Π§ΠΠΠ˜Π•: спСцифично для GNU/Linux! */

4

5   #include <stdio.h>

6   #include <errno.h>

7   #include <mntent.h> /* для getmntent() ΠΈ Π΄Ρ€. */

8   #include <unistd.h> /* для getopt() */

9   #include <sys/types.h>

10  #include <sys/vfs.h>

11

12  /* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ взяты ΠΈΠ· справочной страницы для statfs(2): */

13  #define AFFS_SUPER_MAGIC     0xADFF

14  #define EFS_SUPER_MAGIC      0x00414A53

15  #define EXT_SUPER_MAGIC      0x137D

16  #define EXT2_OLD_SUPER_MAGIC 0xEF51

17  #define EXT2_SUPER_MAGIC     0xEF53

18  #define HPFS_SUPER_MAGIC     0xF995E849

19  #define ISOFS_SUPER_MAGIC    0x9660

20  #define MINIX_SUPER_MAGIC    0x137F /* ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ minix */

21  #define MINIX_SUPER_MAGIC2   0x138F /* 30-симв. minix */

22  #define MINIX2_SUPER_MAGIC   0x2468 /* minix V2 */

23  #define MINIX2_SUPER_MAGIC2  0x2478 /* minix V2, ΠΈΠΌΠ΅Π½Π° 30 симв. */

24  #define MSDOS_SUPER_MAGIC    0x4d44

25  #define NCP_SUPER_MAGIC      0x564c

26  #define NFS_SUPER_MAGIC      0x6969

27  #define PROC_SUPER_MAGIC     0x9fa0

28  #define SMB_SUPER_MAGIC      0x517B

29  #define XENIX_SUPER_MAGIC    0x012FF7B4

30  #define SYSV4_SUPER_MAGIC    0x012FF7B5

31  #define SYSV2_SUPER_MAGIC    0x012FF7B6

32  #define COH_SUPER_MAGIC      0x012FF7B7

33  #define UFS_MAGIC            0x00011954

34  #define XFS_SUPER_MAGIC      0x58465342

35  #define _XIAFS_SUPER_MAGIC   0x012FD16D

36

37  void process(const char *filename);

38  void do_statfs(const struct mntent *fs);

39

40  int errors = 0;

41  char *myname;

42

    /* ...main() Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, process() ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π°... */

85

86  /* type2str --- ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° fs Π² строку ΠΈΠ· statfs(2) */

87

88  const char *type2str(long type)

89  {

90   static struct fsname {

91    long type;

92    const char *name;

93   } table[] = {

94    { AFFS_SUPER_MAGIC, "AFFS" },

95    { COH_SUPER_MAGIC, "COH" },

96    { EXT2_OLD_SUPER_MAGIC, "OLD EXT2" },

97    { EXT2_SUPER_MAGIΠ‘, "EXT2" },

98    { HPFS_SUPER_MAGIC, "HPFS" },

99    { ISOFS_SUPER_MAGIC, "ISOFS" },

100   { MINIX2_SUPER_MAGIC, "MINIX V2" },

101   { MINIX2_SUPER_MAGIC2, "MINIX V2 30 char" },

102   { MINIX_SUPER_MAGIC, "MINIX" },

103   { MINIX_SUPER_MAGIC2, "MINIX 30 char" },

104   { MSDOS_SUPER_MAGIC, "MSDOS" },

105   { NCP_SUPER_MAGIΠ‘, "NCP" },

106   { NFS_SUPER_MAGIC, "NFS" },

107   { PROC_SUPER_MAGIC, "PROC" },

108   { SMB_SUPER_MAGIC, "SMB" },

109   { SYSV2_SUPER_MAGIC, "SYSV2" },

110   { SYSV4_SUPER_MAGIC, "SYSV4" },

111   { UFS_MAGIC, "UFS" },

112   { XENIX_SUPER_MAGIC, "XENIX" },

113   { _XIAFS_SUPER_MAGIC, "XIAFS" },

114   { 0, NULL },

115  };

116  static char unknown[100];

117  int i;

118

119  for (i = 0; table[i].type != 0; i++)

120   if (table[i].type == type)

121    return table[i].name;

122

123  sprintf(unknown, "unknown type: %#x", type);

124  return unknown;

125 }

126

127 /* do_statfs --- Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ statfs ΠΈ вывСсти свСдСния */

128

129 void do_statfs(const struct mntent *fs)

130 {

131  struct statfs vfs;

132

133  if (fs->mnt_fsname[0] != '/') /* ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ систСмы */

134   return;

135

136  if (statfs(fs->mnt_dir, &vfs) != 0) {

137   fprintf(stderr, "%s: %s: statfs failed: %s\n",

138    myname, fs->mnt_dir, strerror(errno));

139   errors++;

140   return;

141  }

142

143  printf("%s, mounted on %s:\n", fs->mnt_dir, fs->mnt_fsname);

144

145  printf("\tf_type: %s\n", type2str(vfs.f_type));

146  printf("\tf_bsize: %ld\n", vfs.f_bsize);

147  printf("\tf_blocks: %ld\n", vfs.f_blocks);

148  printf("\tf_bfree: %ld\n", vfs.f_bfree);

149  printf("\tf_bavail: %ld\n", vfs.f_bavail);

150  printf("\tf_files: %ld\n", vfs.f_files);

151  printf("\tf_ffree: %ld\n", vfs.f_ffree);

152  printf("\tf_namelen: %ld\n", vfs.f_namelen);

153 }

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ мСсто, ΠΌΡ‹ опустили main(), которая Π½Π΅ измСнилась с прСдставлСнной Ρ€Π°Π½Π΅Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ опустили process (), которая Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ do_statfs() вмСсто do_statvfs().

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 13–35 содСрТат список магичСских чисСл Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСм ΠΈΠ· справочной страницы statfs(2). Π₯отя эти числа ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² исходного ΠΊΠΎΠ΄Π° ядра, это Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ (ΠΌΡ‹ ΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π»ΠΈ), Π° ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ здСсь способу прСдставлСния ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π»Π΅Π³Ρ‡Π΅. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 86–125 ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ type2str(), которая ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ магичСскоС число Π² Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡƒΡŽ строку. Она осущСствляСт простой Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΠ°Ρ€ (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, строка). Π’ (маловСроятном) случаС, ΠΊΠΎΠ³Π΄Π° магичСскоС число Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ отсутствуСт, type2str() создаСт сообщСниС «нСизвСстный Ρ‚ΠΈΠΏΒ» ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ (строки 123–124).

do_statfs() (строки 129–153) Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ свСдСния ΠΈΠ· struct statfs. Π§Π»Π΅Π½ f_fsid ΠΎΠΏΡƒΡ‰Π΅Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ fsid_t являСтся Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ. Код прост; строка 145 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ type2str() для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚ΠΈΠΏΠ° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы. Как для сходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ statvfs(), эта функция ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ систСмы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ располоТСны Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… устройствах (строки 133–134). Π’ΠΎΡ‚ Π²Ρ‹Π²ΠΎΠ΄ Π½Π° нашСй систСмС:

$ ch08-statfs /* Запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

/, mounted on /dev/hda2: /* Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ для Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы ext2 */

f_type: Π•Π₯Π’2

f_bsize: 4096

f_blocks: 1549609

f_bfrΠ΅Π΅: 316664

f_bavail: 237946

f_files: 788704

f_ffree: 555483

f_namelen: 255

...

/win, mounted on /dev/hda1: /* Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ для Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ с-ΠΌΡ‹ vfat */

f_type: MSDOS

f_bsize: 4096

f_blocks: 2092383

f_bfree: 1391952

f_bavail: 1391952

f_files: 0

f_ffree: 0

f_namelen: 260

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, использованиС statvfs() ΠΈΠ»ΠΈ statfs() Π² вашСм собствСнном ΠΊΠΎΠ΄Π΅ зависит ΠΎΡ‚ Π²Π°ΡˆΠΈΡ… потрСбностСй. Как описано Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅, GNU df Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ statvfs() ΠΏΠΎΠ΄ GNU/Linux ΠΈ Π² ΠΎΠ±Ρ‰Π΅ΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Unix-систСмы систСмный Π²Ρ‹Π·ΠΎΠ² «получСния свСдСний ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС». Π₯отя это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, это Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΈΠ½ΠΎΠ³Π΄Π° Ρƒ вас Π½Π΅Ρ‚ Π²Ρ‹Π±ΠΎΡ€Π°: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ GLIBC, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΈ Π²Ρ‹ΡˆΠ΅. Π’ этом случаС Π½Π΅Ρ‚ Π±Π΅Π·ΡƒΠΏΡ€Π΅Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

8.4. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²

НСсколько систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ стандартных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ. Π‘ΠΎΠ»Π΅Π΅ слоТныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ дСйствия с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ².