Рейтинговые книги
Читем онлайн Основы программирования в Linux - Нейл Мэтью

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 36 37 38 39 40 41 42 43 44 ... 200

Для того чтобы составить представление об окружении в системе 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

1 ... 36 37 38 39 40 41 42 43 44 ... 200
На этой странице вы можете бесплатно читать книгу Основы программирования в Linux - Нейл Мэтью бесплатно.
Похожие на Основы программирования в Linux - Нейл Мэтью книги

Оставить комментарий