Шрифт:
Интервал:
Закладка:
Для того чтобы составить представление об окружении в системе Linux, обсуждаемом в главе 4, познакомьтесь с одним из способов, повышающих универсальность программы. Рассматриваемая программа ограничена, потому что привязана каталогу /home. Следующие изменения в функции main могли бы превратить эту программу в полезный обозреватель каталогов:
int main(int argc, char* argv[]) {
char *topdir = ".";
if (argc >= 2) topdir = argv[1];
printf("Directory scan of %sn", topdir);
printdir(topdir, 0);
printf("done.n");
exit(0);
}
Три строки изменены и пять добавлено, но это уже универсальная утилита с необязательным параметром, содержащим имя каталога, по умолчанию равным текущему каталогу. Вы можете выполнять ее с помощью следующей командной строки:
$ ./printdir2 /usr/local | more
Вывод будет разбит на страницы, и пользователь сможет листать их. Таким образом, у него появится маленький удобный универсальный обозреватель дерева каталогов. Приложив минимум усилий, вы могли бы добавить статистический показатель использования пробелов, предельную глубину отображения и т.д.
Ошибки
Как вы видели, многие системные вызовы и функции, описанные в этой главе, могут завершиться аварийно по ряду причин. Когда это происходит, они указывают причину сбоя, задавая значение внешней переменной errno. Многие стандартные библиотеки используют эту переменную как стандартный способ оповещения о возникших проблемах. Стоит повторить, что программа должна проверять переменную errno сразу же после возникновения проблемы в функции, поскольку errno может быть изменена следующей вызванной функцией, даже если она завершилась нормально.
Имена констант и варианты ошибок перечислены в заголовочном файле errno.h. К ним относятся следующие:
□ EPERM — Operation not permitted (операция не разрешена);
□ ENOENT — No such file or directory (нет такого файла или каталога);
□ EINTR — Interrupted system call (прерванный системный вызов);
□ EIO — I/O Error (ошибка ввода/вывода);
□ EBUSY — Device or resource busy (устройство или ресурс заняты);
□ EEXIST — File exists (файл существует);
□ EINVAL — Invalid argument (неверный аргумент);
□ EMFILE — Too many open files (слишком много открытых файлов);
□ ENODEV — No such device (нет такого устройства);
□ EISDIR — Is a directory (это каталог);
□ ENOTDIR — Isn't a directory (это не каталог).
Есть пара полезных функций, сообщающих об ошибках при их возникновении: strerror и perror.
strerror
Функция strerror преобразует номер ошибки в строку, описывающую тип возникшей ошибки. Она может быть полезна для регистрации условий, вызывающих ошибку.
Далее приведена ее синтаксическая запись:
#include <string.h>
char *strerror(int errnum);
perror
Функция perror также превращает текущую ошибку в виде, представленном в переменной errno, в строку и выводит ее в стандартный поток ошибок. Ей предшествует сообщение, заданное в строке s (если указатель не равен NULL), за которым следуют двоеточие и пробел.
Далее приведена синтаксическая запись функции:
#include <stdio.h>
void perror(const char *s);
Например, вызов
perror("program");
может дать следующий результат в стандартном потоке ошибок:
program: Too many open files
Файловая система procfs
Ранее в этой главе мы уже писали о том, что ОС Linux обрабатывает многие вещи как файлы, и в файловой системе есть ряд элементов для аппаратных устройств. Эти файлы /dev применяются для доступа к оборудованию особыми методами с помощью низкоуровневых системных вызовов.
Программные драйверы, управляющие оборудованием, часто могут настраиваться определенными способами или сообщать информацию. Например, контроллер жесткого диска может настраиваться на применение определенного режима DMA. Сетевая карта может обладать функциональными возможностями для оповещения об установке высокоскоростного дуплексного соединения.
В прошлом для связи с драйверами устройств применялись утилиты общего назначения. Например, hdparm использовалась для настройки некоторых параметров диска, a ifconfig могла сообщить сетевую статистику. В недавнем прошлом появилась тенденция, направленная на обеспечение более подходящего способа доступа к информации драйвера и, как расширение, включающая взаимодействие с различными элементами ядра Linux.
ОС Linux предоставляет специальную файловую систему procfs, которая обычно доступна в виде каталога /proc. Она содержит много специальных файлов, обеспечивающих высокоуровневый доступ к информации драйвера и ядра. Приложения, выполняющиеся с корректными правами доступа, могут читать эти файлы для получения информации и записывать в них устанавливаемые параметры.
Набор файлов в каталоге /proc меняется от системы к системе, и с каждым новым выпуском Linux появляются новые файлы, дополнительные драйверы и средства поддержки файловой системы procfs. В этом разделе мы рассмотрим некоторые из самых широко распространенных файлов и кратко обсудим их применение.
В перечень каталога /proc на компьютере, использовавшемся для написания этой главы, включены следующие элементы:
1/ 10514/ 20254/ 6/ 9057/ 9623/ ide/ mtrr
10359/ 10524/ 29/ 698/ 9089/ 9638/ interrupts net/
10360/ 10530/ 983/ 699/ 9118/ acpi/ iomem partitions
10381/ 10539/ 3/ 710/ 9119/ asound/ ioports scsi/
10438/ 10541/ 30/ 711/ 9120/ buddyinfo irq/ [email protected]
10441/ 10555/ 3069/ 742/ 9138/ bus/ kallsyms slabinfo
10442/ 10688/ 3098/ 7808/ 9151/ cmdline kcore splash
10478/ 10689/ 3099/ 7813/ 92/ config.gz keys stat
10479/ 10784/ 31/ 8357/ 9288/ cpuinfo key-users swaps
10482/ 113/ 3170/ 8371/ 93/ crypto kmsg sys/
10484/ 115/ 3171/ 840/ 9355/ devices loadavg sysrq-trigger
10486/ 116/ 3177/ 8505/ 9407/ diskstats locks sysvipc/
10495/ 1167/ 32288/ 8543/ 9457/ dma mdstat tty/
10497/ 1168/ 3241/ 8547/ 9479/ driver/ meminfo uptime
Во многих случаях файлы могут только читаться и дают информацию о состоянии. Например, /proc/cpuinfo предоставляет сведения о доступных процессорах:
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Pentium(R) 4 CPU 2.66GHz
stepping : 8
cpu MHz : 2665.923
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr рае mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush dts acpi mmx fxsr sse sse2 ss up
bogomips : 5413.47
clflush size : 64
Файлы /proc/meminfo и /рroc/version предоставляют данные об использовании оперативной памяти и версии ядра соответственно:
$ cat /proc/meminfo
MemTotal: 776156 kB
MemFree: 28528 kB
Buffers: 191764 kB
Cached: 369520 kB
SwapCached: 20 kB
Active: 406912 kB
Inactive: 274320 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 776156 kB
LowFree: 28528 kB
SwapTotal: 1164672 kB
SwapFree: 1164652 kB
Dirty: 68 kB
Writeback: 0 kB
AnonPages: 95348 kB
Mapped: 49044 kB
Slab: 57848 kB
SReclaimable: 48008 kB
SUnreclaim: 9840 kB
PageTables: 1500 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 1552748 kB
Committed_AS: 189680 kB
VmallocTotal: 245752 kB
VmallocUsed: 10572 kB
VmallocChunk: 234556 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 4096 kB
$ cat /proc/version
Linux version 2.6.20.2-2-default ([email protected]) (gcc version 4.1.3 20070218 (prerelease) (SUSE Linux)) #1 SMP Fri Mar 9 21:54:10 UTC 2007
Информация, выводимая этими файлами, генерируется при каждом чтении файла. Поэтому повторное чтение файла meminfo в более поздний момент времени даст результаты с точностью до секунд.
Получить дополнительную информацию от специальных функций ядра можно в подкаталогах каталога /proc. Например, статистику использования сетевых сокетов вы можете узнать из /proc/net/sockstat:
$ cat /proc/net/sockstat
sockets: used 285
TCP: inuse 4 orphan 0 tw 0 alloc 7 mem 1
UDP: inuse 3
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
- Linux - Алексей Стахнов - Программное обеспечение
- Разработка приложений в среде Linux. Второе издание - Майкл Джонсон - Программное обеспечение
- Искусство программирования для Unix - Эрик Реймонд - Программное обеспечение
- Fedora 8 Руководство пользователя - Денис Колисниченко - Программное обеспечение
- Linux Mint и его Cinnamon. Очерки применителя - Алексей Федорчук - Программное обеспечение
- Недокументированные и малоизвестные возможности Windows XP - Роман Клименко - Программное обеспечение
- ELASTIX – общайтесь свободно - Владислав Юров - Программное обеспечение
- Изучаем Windows Vista. Начали! - Дмитрий Донцов - Программное обеспечение
- Windows Vista - Сергей Вавилов - Программное обеспечение
- Операционная система UNIX - Андрей Робачевский - Программное обеспечение