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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Linux. ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 42

Автор ΠœΠ°Ρ€ΠΊ ΠœΠΈΡ‚Ρ‡Π΅Π»Π»

7.5.4. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

Π’ Ρ„Π°ΠΉΠ»Π΅ /proc/locks пСрСчислСны всС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², установлСнныС Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π² систСмС. КаТдая строка соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅.

Для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, созданных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ fcntl() (описана Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 8.3. "Ѐункция fcntl(): Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ"), ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ двумя элСмСнтами строки Π±ΡƒΠ΄ΡƒΡ‚ слова POSIX ΠΈ ADVISORY. Π’Ρ€Π΅Ρ‚ΡŒΠΈΠΌ элСмСнтом Π±ΡƒΠ΄Π΅Ρ‚ WRITE ΠΈΠ»ΠΈ READ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ число β€” это ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. Π—Π° Π½ΠΈΠΌ ΠΈΠ΄ΡƒΡ‚ Ρ‚Ρ€ΠΈ числа, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ двоСточиями. Π­Ρ‚ΠΎ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ ΠΈ младший Π½ΠΎΠΌΠ΅Ρ€Π° устройства, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ располоТСн Ρ„Π°ΠΉΠ», Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½ΠΎΠΌΠ΅Ρ€ индСксного дСскриптора, ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° мСстополоТСниС Ρ„Π°ΠΉΠ»Π° Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС. ΠžΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ числа ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ ядра ΠΈ Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ интСрСса.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» /proc/locks, запуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π² листингС 8.2. ΠΈ ΠΏΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ записи Π½Π° Ρ„Π°ΠΉΠ» /tmp/test-file.

% touch /trap/test-file

% ./lock-file /tmp/test-file

file /tmp/test-file

opening /tmp/test-file

locking

locked; hit enter to unlock...

Π’ Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΠΊΠ½Π΅ просмотритС содСрТимоС Ρ„Π°ΠΉΠ»Π° /proc/ locks:

% cat /proc/locks

ls POSIX ADVISORY WRITE 5467 08:05:181288 0 2147483647 d1b5f740

00000000 dfea7d40 00000000 00000000

Π’ Ρ„Π°ΠΉΠ»Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ строки, Ссли ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ устанавливали свои Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ lock-file β€” 5467. УбСдимся Π² этом с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ps:

% ps 5467

 PID TTY    STAT TIME COMMAND

5467 pts/28 S    0:00 ./lock-file /tmp/test-file

Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» /tmp/test-file находится Π½Π° устройствС со ΡΡ‚Π°Ρ€ΡˆΠΈΠΌ ΠΈ младшим Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ 8 ΠΈ 5 соотвСтствСнно. Π­Ρ‚ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° устройства /dev/sda5:

% df /trap

Filesystem 1k-blocks    Used Available Use% Mounted on

/dev/sda5    8459764 5094292   2935736  63% /

% ls -l /dev/sda5

brw-rw---- 1 root disk 8, 5 May 5 1998 /dev/sda5

На этом устройствС с Ρ„Π°ΠΉΠ»ΠΎΠΌ /tmp/test-file связав индСксный дСскриптор 181288:

% ls --inode /trap/test-file

181288 /tmp/test-file

7.6. БистСмная статистика

Π”Π²Π° элСмСнта Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы /proc содСрТат ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΠΈΡΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π’ Ρ„Π°ΠΉΠ»Π΅ /proc/loadavg находятся Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ загруТСнности систСмы. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ показатСля β€” это число Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ (Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ процСссов) Π·Π° послСдниС 1, 5 ΠΈ 15 ΠΌΠΈΠ½ΡƒΡ‚. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строка ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ число выполняСмых Π·Π°Π΄Π°Ρ‡ (процСссов, Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ, Π° Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ систСмном Π²Ρ‹Π·ΠΎΠ²Π΅) Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΎΠ±Ρ‰Π΅Π΅ число процСссов Π² систСмС. ПослСдняя строка содСрТит ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ самого Π½Π΅Π΄Π°Π²Π½Π΅Π³ΠΎ процСсса.

Π’ Ρ„Π°ΠΉΠ»Π΅ /proc/uptime ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΡˆΠ»ΠΎ с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ систСмы ΠΈ сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ с Ρ‚Π΅Ρ… ΠΏΠΎΡ€ систСма ΠΏΡ€Π΅Π±Ρ‹Π²Π°Π»Π° Π² Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ состоянии. Оба показатСля Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Ρ‹ Π² сСкундах ΠΈ прСдставлСны числами с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ запятой:

% cat /proc/uptime

3248936.18 3072330.49

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, показанная Π² листингС 7 7. опрСдСляСт ΠΎΠ±Ρ‰Π΅Π΅ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ врСмя простоя систСмы ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ эти значСния Π² понятном Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅.

Листинг 7.7. (print-uptime.c) ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ простоя систСмы

#include <stdio.h>


/* Π—Π°ΠΏΠΈΡΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² стандартный Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

   ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ TIME это количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ LABEL --

   короткая ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ строка. */

void print_time(char* label, long time) {

 /* ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ прСобразования. */

 const long minute = 60;

 const long hour = minute * 60;

 const long day = hour * 24; /* Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. */

 printf("%s: %ld days, %ld:%02ld:%02ld\n", label, time / day,

  (time % day) / hour, (time % hour) / minute, time % minute);

}


int main() {

 FILE* fp;

 double uptime, idle_time;

 /* Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° /proc/uptime. */

 fp = fopen("/proc/uptime", "r");

 fscanf(fp, "%lf %lf\n", &uptime, &idle_time);

 fclose(fp);

 /* Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄. */

 print_time("uptime ", (long)uptime);

 print_time("idle time", (long)idle_time);

 return 0;

}

ΠžΠ±Ρ‰Π΅Π΅ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ систСмы ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° uptime ΠΈ функция sysinfo() (описана Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 8.14, "Ѐункция sysinfo(): ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ систСмной статистики"). Команда uptime Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ срСднСй загруТСнности, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΡ‹Π΅ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° /proc/loadavg.

Π“Π»Π°Π²Π° 8

БистСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Linux

ΠœΡ‹ ΡƒΠΆΠ΅ познакомились с большим количСством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ систСмныС Π·Π°Π΄Π°Ρ‡ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ процСссами ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² памяти. Если ΠΏΡ€ΠΈΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒΡΡ ΠΏΠΎΠ²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Π΅Π΅, Ρ‚ΠΎ окаТСтся, Ρ‡Ρ‚ΠΎ всС ΠΎΠ½ΠΈ ΠΏΠΎΠ΄ΠΏΠ°Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ΄ Π΄Π²Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Π² зависимости ΠΎΡ‚ способа Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

β–  Π‘иблиотСчная функция β€” это обычная функция, которая находится Π²ΠΎ внСшнСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ рассмотрСнных Π½Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ содСрТится Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ языка Π‘, libc. Π’Ρ‹Π·ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ рСализуСтся Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ: Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² рСгистры процСссора ΠΈΠ»ΠΈ Π² стСк ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаСтся Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (этот ΠΊΠΎΠ΄ находится Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ).

β–  Π‘истСмный Π²Ρ‹Π·ΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² ядрС Linux. АргумСнты Π²Ρ‹Π·ΠΎΠ²Π° ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ядру, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Π΅Ρ€Π΅Ρ‚ Π½Π° сСбя ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, ΠΏΠΎΠΊΠ° Π²Ρ‹Π·ΠΎΠ² Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. БистСмный Π²Ρ‹Π·ΠΎΠ² β€” это Π½Π΅ обычная функция, ΠΈ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ управлСния ядру трСбуСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. Π’ GNU-Π±ΠΈΠ±Π»Π½ΠΎΡ‚Π΅ΠΊΠ΅ языка Π‘ (рСализация стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰Π°ΡΡΡ Π² Linux) для систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² созданы Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π½ΠΈΠΌ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ привСсти Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ open() ΠΈ read().

Π‘ΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Linux Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ основной интСрфСйс ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ ΠΈ ядром. ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π²Ρ‹Π·ΠΎΠ²Ρƒ соотвСтствуСт нСкая элСмСнтарная опСрация ΠΈΠ»ΠΈ функция.

НСкоторыС систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎΡ‡Π΅Π½ΡŒ большоС влияниС Π½Π° систСму. НапримСр. Π΅ΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Linux, Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ систСмныС рСсурсы ΠΈΠ»ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ доступ ΠΊ рСсурсам. Π‘ Ρ‚Π°ΠΊΠΈΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ связано ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅: Ρ‚ΠΎΠ»ΡŒΠΊΠΎ процСссы, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ с привилСгиями ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (учСтная запись root), ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π½ΠΈΠΌ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ ошибкой.

Π’Π½ΡƒΡ‚Ρ€ΠΈ сСбя библиотСчная функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ функциям ΠΈΠ»ΠΈ систСмным Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ.

Π’ настоящСС врСмя Π² Linux Π΅ΡΡ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 200 систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Π˜Ρ… список находится Π² Ρ„Π°ΠΉΠ»Π΅ /usr/include/asm/unistd.h. НСкоторыС ΠΈΠ· Π½ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ систСмы, Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ лишь для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ спСциализированных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ этой Π³Π»Π°Π²Π΅ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Ρ‚Π΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‡Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ систСмными программистами.

8.1. Команда strace

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ strace, которая отслСТиваСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, выводя список всСх Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… сигналов. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ставится Π² Π½Π°Ρ‡Π°Π»Π΅ строки Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:[26]

% strace hostname

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ нСсколько экранов Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. КаТдая строка соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΌΡƒ систСмному Π²Ρ‹Π·ΠΎΠ²Ρƒ. Π’ строкС ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ имя Π²Ρ‹Π·ΠΎΠ²Π°, Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ (ΠΈΠ»ΠΈ ΠΈΡ… сокращСнныС обозначСния, Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ слишком Π΄Π»ΠΈΠ½Π½Ρ‹Π΅) ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. По возмоТности ΠΊΠΎΠΌΠ°Π½Π΄Π° strace стараСтся ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π½Π΅ числовыС значСния, Π° символичСскиС константы. ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ поля структур, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ. Π’Ρ‹Π·ΠΎΠ²Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

Π’ случаС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ strace hostname пСрвая строка сообщаСт ΠΎ систСмном Π²Ρ‹Π·ΠΎΠ²Π΅ execve(), Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ hostname:[27]

execve("/bin/hostname", ["hostname"], [/* 49 vars */]) = 0

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” это имя запускаСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π—Π° Π½ΠΈΠΌ ΠΈΠ΄Π΅Ρ‚ список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², состоящий ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта. Π”Π°Π»ΡŒΡˆΠ΅ ΡƒΠΊΠ°Π·Π°Π½ список ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… срСды, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π° strace опустила для краткости.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 30 строк ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ языка Π‘ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π‘Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, связанныС нСпосрСдствСнно с Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. БистСмный Π²Ρ‹Π·ΠΎΠ² uname() Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ имя ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Ρƒ ядра:

uname({sys="Linux", node="myhostname", ...}) = 0

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° strace ΠΏΠΎΠΊΠ°Π·Π°Π»Π° ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠΎΠ»Π΅ΠΉ структуры, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранятся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Π­Ρ‚Π° структура заполняСтся Π² систСмном Π²Ρ‹Π·ΠΎΠ²Π΅: Linux ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² ΠΏΠΎΠ»Π΅ sys имя ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, Π° Π² ΠΏΠΎΠ»Π΅ node β€” имя ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Ѐункция uname() Π±ΡƒΠ΄Π΅Ρ‚ описана Π½ΠΈΠΆΠ΅, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 8.15. "Ѐункция uname()".