int main(int argc, char* argv[]) { char *topdir = "."; if (argc >= 2) topdir = argv[1]; printf("Directory scan of %s\n", topdir); printdir(topdir, 0); printf("done.\n"); exit(0);}Три строки изменены и пять добавлено, но это уже универсальная утилита с необязательным параметром, содержащим имя каталога, по умолчанию равным текущему каталогу. Вы можете выполнять ее с помощью следующей командной строки:
$ <b>./printdir2 /usr/local | more</b>Вывод будет разбит на страницы, и пользователь сможет листать их. Таким образом, у него появится маленький удобный универсальный обозреватель дерева каталогов. Приложив минимум усилий, вы могли бы добавить статистический показатель использования пробелов, предельную глубину отображения и т.д.
Ошибки
Как вы видели, многие системные вызовы и функции, описанные в этой главе, могут завершиться аварийно по ряду причин. Когда это происходит, они указывают причину сбоя, задавая значение внешней переменной
errnoИмена констант и варианты ошибок перечислены в заголовочном файле errno.h. К ним относятся следующие:
□
EPERM□
ENOENT□
EINTR□
EIO□
EBUSY□
EEXIST□
EINVAL□
EMFILE□
ENODEV□
EISDIR□
ENOTDIRЕсть пара полезных функций, сообщающих об ошибках при их возникновении:
strerrorperrorstrerror
Функция
strerrorДалее приведена ее синтаксическая запись:
<b>#include <string.h></b><b>char *strerror(int errnum);</b>perror
Функция
perrorerrnosNULLДалее приведена синтаксическая запись функции:
<b>#include <stdio.h></b><b>void perror(const char *s);</b>Например, вызов
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/ mtrr10359/ 10524/ 29/ 698/ 9089/ 9638/ interrupts net/10360/ 10530/ 983/ 699/ 9118/ acpi/ iomem partitions10381/ 10539/ 3/ 710/ 9119/ asound/ ioports scsi/10438/ 10541/ 30/ 711/ 9120/ buddyinfo irq/ [email protected]10441/ 10555/ 3069/ 742/ 9138/ bus/ kallsyms slabinfo10442/ 10688/ 3098/ 7808/ 9151/ cmdline kcore splash10478/ 10689/ 3099/ 7813/ 92/ config.gz keys stat10479/ 10784/ 31/ 8357/ 9288/ cpuinfo key-users swaps10482/ 113/ 3170/ 8371/ 93/ crypto kmsg sys/10484/ 115/ 3171/ 840/ 9355/ devices loadavg sysrq-trigger10486/ 116/ 3177/ 8505/ 9407/ diskstats locks sysvipc/