Чтение онлайн

ЖАНРЫ

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

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
.

Поделиться с друзьями: