% 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. определяет общее время работы и время простоя системы и отображает эти значения в понятном формате.
#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 формирует основной интерфейс между программами и ядром. Каждому вызову соответствует некая элементарная операция или функция.