Читаем Linux API. Исчерпывающее руководство полностью

Содержимое файла ename.c.inc конкретизировано под архитектуру, поскольку значения errno в различных аппаратных архитектурах Linux несколько различаются. Версия, показанная в листинге 3.4, предназначена для системы Linux 2.6/x86-32. Этот файл был создан с использованием сценария (lib/Build_ename.sh), включенного в исходный код дистрибутива для данной книги. Сценарий можно использовать для создания версии ename.c.inc, которая должна подойти для конкретной аппаратной платформы и версии ядра.

Обратите внимание, что некоторые строки в массиве ename не заполнены. Они соответствуют неиспользуемым значениям ошибок. Кроме того, отдельные строки в ename состоят из двух названий ошибок, разделенных слешем. Они соответствуют тем случаям, когда у двух символьных имен ошибок имеется одно и то же числовое значение.

В файле ename.c.inc мы можем увидеть, что у ошибок EAGAIN и EWOULDBLOCK одно и то же значение. (В SUSv3 на этот счет есть явно выраженное разрешение, и значения этих констант одинаковы в большинстве, но не во всех других системах UNIX.) Эти ошибки возвращаются системным вызовом в тех случаях, когда он должен быть заблокирован (то есть вынужден находиться в режиме ожидания, прежде чем завершить свою работу), но вызывающий код потребовал, чтобы системный вызов вместо входа в режим блокировки вернул ошибку. Ошибка EAGAIN появилась в System V и возвращалась системными вызовами, выполняющими ввод/вывод, операции с семафорами, операции с очередями сообщений и блокировку файлов (fcntl()). Ошибка EWOULDBLOCK появилась в BSD и возвращалась блокировкой файлов (flock()) и системными вызовами, связанными с сокетами.

В SUSv3 ошибка EWOULDBLOCK упоминается только в спецификациях различных интерфейсов, связанных с сокетами. Для этих интерфейсов в SUSv3 разрешается возвращение при неблокируемых вызовах либо EAGAIN, либо EWOULDBLOCK. Для всех других неблокируемых вызовов в SUSv3 указана только ошибка EAGAIN.

Листинг 3.4. Имена ошибок Linux (для версии x86-32)

lib/ename.c.inc

static char *ename[] = {

/* 0 */ "",

/* 1 */ "EPERM", "ENOENT", "ESRCH", "EINTR", "EIO", "ENXIO", "E2BIG",

/* 8 */ "ENOEXEC", "EBADF", "ECHILD", "EAGAIN/EWOULDBLOCK", "ENOMEM",

/* 13 */ "EACCES", "EFAULT", "ENOTBLK", "EBUSY", "EEXIST", "EXDEV",

/* 19 */ "ENODEV", "ENOTDIR", "EISDIR", "EINVAL", "ENFILE", "EMFILE",

/* 25 */ "ENOTTY", "ETXTBSY", "EFBIG", "ENOSPC", "ESPIPE", "EROFS",

/* 31 */ "EMLINK", "EPIPE", "EDOM", "ERANGE", "EDEADLK/EDEADLOCK",

/* 36 */ "ENAMETOOLONG", "ENOLCK", "ENOSYS", "ENOTEMPTY", "ELOOP", "",

/* 42 */ "ENOMSG", "EIDRM", "ECHRNG", "EL2NSYNC", "EL3HLT", "EL3RST",

/* 48 */ "ELNRNG", "EUNATCH", "ENOCSI", "EL2HLT", "EBADE", "EBADR",

/* 54 */ "EXFULL", "ENOANO", "EBADRQC", "EBADSLT", "", "EBFONT",

"ENOSTR",

/* 61 */ "ENODATA", "ETIME", "ENOSR", "ENONET", "ENOPKG", "EREMOTE",

/* 67 */ "ENOLINK", "EADV", "ESRMNT", "ECOMM", "EPROTO", "EMULTIHOP",

/* 73 */ "EDOTDOT", "EBADMSG", "EOVERFLOW", "ENOTUNIQ", "EBADFD",

/* 78 */ "EREMCHG", "ELIBACC", "ELIBBAD", "ELIBSCN", "ELIBMAX",

/* 83 */ "ELIBEXEC", "EILSEQ", "ERESTART", "ESTRPIPE", "EUSERS",

/* 88 */ "ENOTSOCK", "EDESTADDRREQ", "EMSGSIZE", "EPROTOTYPE",

/* 92 */ "ENOPROTOOPT", "EPROTONOSUPPORT", "ESOCKTNOSUPPORT",

/* 95 */ "EOPNOTSUPP/ENOTSUP", "EPFNOSUPPORT", "EAFNOSUPPORT",

/* 98 */ "EADDRINUSE", "EADDRNOTAVAIL", "ENETDOWN", "ENETUNREACH",

/* 102 */ "ENETRESET", "ECONNABORTED", "ECONNRESET", "ENOBUFS", "EISCONN",

/* 107 */ "ENOTCONN", "ESHUTDOWN", "ETOOMANYREFS", "ETIMEDOUT",

/* 111 */ "ECONNREFUSED", "EHOSTDOWN", "EHOSTUNREACH", "EALREADY",

/* 115 */ "EINPROGRESS", "ESTALE", "EUCLEAN", "ENOTNAM", "ENAVAIL",

/* 120 */ "EISNAM", "EREMOTEIO", "EDQUOT", "ENOMEDIUM", "EMEDIUMTYPE",

/* 125 */ "ECANCELED", "ENOKEY", "EKEYEXPIRED", "EKEYREVOKED",

/* 129 */ "EKEYREJECTED", "EOWNERDEAD", "ENOTRECOVERABLE", "ERFKILL"

};

#define MAX_ENAME 132

lib/ename.c.inc

Функции для анализа числовых аргументов командной строки

Заголовочный файл в листинге 3.5 содержит объявление двух функций, часто используемых для анализа целочисленных аргументов командной строки: getInt() и getLong(). Главное преимущество использования этих функций вместо atoi(), atol() и strtol() заключается в том, что они предоставляют основные средства проверки на допустимость числовых аргументов.

#include "tlpi_hdr.h"

int getInt(const char *arg, int flags, const char *name);

long getLong(const char *arg, int flags, const char *name);

Обе возвращают значение arg, преобразованное в число

Функции getInt() и getLong() преобразуют строку, на которую указывает параметр arg, в значение типа int или long соответственно. Если arg не содержит допустимый строковый образ целого числа (то есть не состоит только лишь из цифр и символов + и —), эта функция выводит сообщение об ошибке и завершает выполнение программы.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных