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

команды 'gcc — Wall', жалующиеся, что "control reaches end of non-void

function", то есть что управление достигло конца функции, которая

должна вернуть значение, если мы используем следующие функции для

прекращения выполнения main() или какой-нибудь другой функции,

которая должна вернуть значение определенного типа (не void) */

#define NORETURN __attribute__ ((__noreturn__))

#else

#define NORETURN

#endif


void errExit(const char *format…) NORETURN;

void err_exit(const char *format…) NORETURN;

void errExitEN(int errnum, const char *format…) NORETURN;

void fatal(const char *format…) NORETURN;

void usageErr(const char *format…) NORETURN;

void cmdLineErr(const char *format…) NORETURN;


#endif

lib/error_functions.h

Для определения типа ошибок системных вызовов и библиотечных функций используются функции errMsg(), errExit(), err_exit() и errExitEN().

#include "tlpi_hdr.h"


void errMsg(const char *format…);

void errExit(const char *format…);

void err_exit(const char *format…);

void errExitEN(int errnum, const char *format…);

Функция errMsg() выводит сообщение на стандартное устройство вывода ошибки. Ее список аргументов совпадает со списком для функции printf(), за исключением того, что в строку вывода автоматически добавляется символ конца строки. Функция errMsg() выводит текст ошибки, соответствующий текущему значению переменной errno. Этот текст состоит из названия ошибки, например EPERM, дополненного описанием ошибки в том виде, в котором его возвращает функция strerror(), а затем следует вывод, отформатированный согласно переданным агрументам.

По своему действию функция errExit() похожа на errMsg(), но она также прекращает выполнение программы, либо вызвав функцию exit(), либо, если переменная среды EF_DUMPCORE содержит непустое строковое значение, вызвав функцию abort(), чтобы создать файл дампа ядра для его использования отладчиком. (Файлы дампа ядра будут рассмотрены в разделе 22.1.)

Функция err_exit() похожа на errExit(), но имеет два отличия:

• не сбрасывает стандартный вывод перед выводом в него сообщения об ошибке;

• завершает процесс путем вызова _exit(), а не exit(). Это приводит к тому, что процесс завершается без сброса буферов stdio или вызова обработчиков выхода.

Подробности этих различий в работе err_exit() станут понятнее при изучении главы 25, где рассматривается разница между _exit() и exit(), а также обработка буферов stdio и обработчики выхода в дочернем процессе, созданном с помощью fork(). А пока мы просто возьмем на заметку, что функция err_exit() будет особенно полезна при написании нами библиотечной функции, создающей дочерний процесс, который следует завершить по причине возникновения ошибки. Это завершение должно произойти без сброса дочерней копии родительских буферов stdio (то есть буферов вызывающего процесса) и без вызова обработчиков выхода, созданных родительским процессом.

Функция errExitEN() представляет собой практически то же самое, что и errExit(), за исключением того, что вместо сообщения об ошибке, характерного текущему значению errno, она выводит текст, соответствующий номеру ошибки (отсюда и суффикс EN), заданному в аргументе errnum.

В основном функция errExitEN() применяется в программах, использующих API потоков стандарта POSIX. В отличие от традиционных системных вызовов UNIX, возвращающих при возникновении ошибки –1, функции потоков стандарта POSIX позволяют определить тип ошибки по ее номеру, возвращенному в качестве результата их выполнения (то есть в errno, как правило, помещается положительный номер типа). (В случае успеха функции потоков стандарта POSIX возвращают 0.)

Определить типы ошибок из функции потоков стандарта POSIX можно с помощью следующего кода:

errno = pthread_create(&thread, NULL, func, &arg);

if (errno!= 0)

errExit("pthread_create");

Но такой подход неэффективен, поскольку в программе, выполняемой в нескольких потоках, errno определяется в качестве макроса. Этот макрос расширяется в вызов функции, возвращающий левостороннее выражение (lvalue). Соответственно, каждое использование errno приводит к вызову функции. Функция errExitEN() позволяет создавать более эффективный эквивалент показанного выше кода:

int s;

s = pthread_create(&thread, NULL, func, &arg);

if (s!= 0)

errExitEN(s, "pthread_create");

Согласно терминологии языка C левостороннее выражение (lvalue) — это выражение, ссылающееся на область хранилища3. Наиболее характерным его примером является идентификатор для переменной. Некоторые операторы также выдают такие выражения. Например, если p является указателем на область хранилища, то *p является левосторонним выражением. Согласно API потоков стандарта POSIX, errno переопределяется в функцию, возвращающую указатель на область хранилища, относящуюся к отдельному потоку (см. раздел 31.3).

Для определения других типов ошибок используются функции fatal(), usageErr() и cmdLineErr().

#include "tlpi_hdr.h"


void fatal(const char *format…);

void usageErr(const char *format…);

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

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

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

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

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

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

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

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