Главная страница Взаимодействие нетривиальных процессов
21 /* Определена, если иожно подключить <tinie.h> вместе с <sys/time.h> */ 22 #define TIME WITH SYS TIME 1 Листинг В.1 (продолжение) 157 #define writew lock(fd, offset, whence, len) \ 158 lock reg(fd. F SETLKW, F WRLCK, offset, whence, len) 159 #define unjocktfd, offset, whence, len) \ 160 lock reg(fd, F SETLK. F UNLCK, offset, whence, len) 161 #define is read lockable(fd. offset, whence, len) \ 162 lock test(fd, F RDLCK. offset, whence, len) 163 #define is write lockable(fd. offset, whence, len) \ 164 lock test(fd. F WRLCK, offset, whence, len) B.2. Заголовочный файл config.h Для подготовки программ в этой книге использовалась утилита GNU autoconf, которая помогает сделать их более переносимыми. Она доступна по адресу ftp: prep.ai.mit.edu/pub/gnu. Утилита создает сценарий configure, который следует запустить после того, как вы загрузите программу из Сети. Этот сценарий определяет возможности вашей системы: поддерживаются ли очереди System V, определен ли тип ui nt8 t, определена ли функция gethostname и т. д. В процессе работы он создает заголовочный файл conf i g. h,. который включается нашим unpi рс. h перед всеми остальными. В листинге В.2 приведен пример заголовочного файла conf i g. h для системы Solaris 2.6 и компилятора gee. Строки, начинающиеся с #def i ne, описывают функции, поддерживаемые в системе. Закомментированные строки соответствуют неподдерживаемым функциям. Листинг В.2. Заголовочный файл config.h для Solaris 2.6 sparc-sun-solaris2.6/config,h 1 /* config.h. Автоматически создается сценарием configure. */ 2 /* Константы следует указывать только тогда, когда есть соответствующий заголовочный файл */ 23 /* Определены, если имеются соответствующие функции */ 24 #define HAVE BZERO 1 25 Idefine HAVEJATTACH 1 26 Idefine HAVE POLL 1 27 /* lundef HAVE PSELECT */ 28 Idefine HAVE SIGWAIT 1 29 Idefine HAVE VALLOC 1 30 Idefine HAVEJSNPRINTF 1 31 /* Определены, если прототипы функций есть в заголовках */ 32 Idefine HAVE GETHOSTNAME PROTO 1 /* <unistd.h> */ 33 Idefine HAVE GETRUSAGE PROTO 1 /* <sys/resource.h> */ 34 /* lundef HAVE PSELECT PROTO */ /* <sys/se1ect.h> */ 35 Idefine HAVE SHM OPEN PROTO 1 /* <sys/mman.h> */ 36 Idefine HAVEJNPRINTF PROtO 1 /* <stdio.h> */ 37 Idefine HAVE THR SETCONCURRENCY PROTO 1 /* <thread.h> */ 38 /* Определены, если определены соответствующие структуры */ 39 Idefine HAVE SIGINFOJ STRUCT 1 /* <signa1 .h> */ 40 Idefine HAVE TIMESPEC STRUCT 1 /* <titne.h> */ 41 /* lundef HAVEJEMUNJNION */ /* <sys/seni.h> */ 42 /* Устройства */ 43 Idefine HAVEJEVJERO 1 44 /* Для соответствующих типов данных */ 45 /* lundef intej */ /* <sys/types.h> */ 46 /* lundef intiej */ /* <sys/types.h> */ 47 /* lundef int32J */ /* <sys/types.h> */ 48 /* lundef uintej */ /* <sys/types.h> */ 49 /* lundef uintl6J */ /* <sys/types.h> */ 50 /* lundef uint32J */ /* <sys/types.h> */ 51 /* lundef sizej */ /* <sys/types.h> */ 52 /* lundef ssizej */ /* <sys/types.h> */ 53 Idefine POSIX IPCJREFIX V 54 Idefine RPCGEN ANSIC 1 /* определена, если rpcgen поддерживает параметр -С */ В.З. Стандартные функции вывода сообщений об ошибках Мы определили свой набор функций, используемых во всех программах книги для обработки ситуаций с возникновением ошибок. Причина, по которой мы создаем эти функции, заключается в том, что теперь мы можем писать команды в одну строку: if (условие ошибки) err sys(формат printf с произвольным количеством аргументов): вместо: if (условие ощибки) { char buff[2003: snprintf(buff.sizeof(buff). формат printf с произвольным количеством аргументов); perror(buff): exit(l): Функции обработки ошибок используют возможности работы со списком аргументов переменной длины, определенные стандартом ANSI С. В разделе 7.3 [ 11 ] вы можете узнать подробности. В таблице В.1 приведены отличия между различными функциями обработки ошибок. Если глобальное целое daemonjroc отлично от нуля, сообщение передается демону syslog с указанным уровнем (см. главу 12 [24]); в противном случае сообщение выводится в стандартный поток сообщений об ошибках. Таблица В.1. Функции обработки ошибок
В листинге В.З приведен текст функций из табл. В.1. Листинг В.3. Функции обработки ошибок lib/error.с 1 #include unpipc.h #include <stdarg.h> #include <syslog.h> /* заголовочный файл ANSI С */ /* для демона syslogO */ int daemon proc; /* устанавливается отличным от нуля daemon init() */ static void err doit(int, int. const char *, vajist); /* Нефатальная ошибка при системном вызове. * Вывод сообщения и возврат из функции. */ 8 void 9 err ret(const char *ffflt, ...) 10 { 11 va list ap; 12 13 14 15 16 va start(ap, fmt); err doit(l. LOGJNFO. fmt. ap); va end(ap); return: 17 /* Фатальная ошибка при системном вызове. 18 * Вывод сообщения и завершение работы, */ 19 void 20 err sys(const char *fmt. ...) 21 { 22 va list, ap; 23 va start(ap. fmt);
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |