- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания UNIX: взаимодействие процессов - Уильям Стивенс
Шрифт:
Интервал:
Закладка:
106 /* Прочие константы */
107 #ifndef РАТН_МАХ /* должна быть в <limits.h> */
108 #define PATH_MAX 1024 /* максимальное количество символов в полном имени файла */
109 #endif
110 #define MAX_PATH 1024
111 #define MAXLINE 4096 /* максимальная длина строки */
112 #define BUFFSI2E 8192 /* объем буфера чтения и записи */
113 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
114 /* разрешения по умолчанию для новых файлов */
115 #define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
116 /* разрешения по умолчанию для новых каталогов */
117 #define SVMSG_MODE (MSG_R | MSG_W | MSG_R>>3 | MSG_R>>6)
118 /* разрешения по умолчанию для новых очередей сообщений System V */
119 #define SVSEM_MODE (SEM_R | SEM_A | SEM_R>>3 | SEM_R>>6)
120 /* разрешения по умолчанию для новых семафоров System V */
121 #define SVSHM_MODE (SHM_R | SHM_W | SHM_R>>3 | SHM_R>>6)
122 /* разрешения по умолчанию для новой разделяемой памяти System V */
123 typedef void Sigfunc(int); /* для обработчиков сигналов */
124 #ifdef HAVE_SIGINFO_T_STRUCT
125 typedef void Sigfunc_rt(int, siginfo_t*, void*);
126 #endif
127 #define min(a,b) ((a) < (b) ? (a) : (b))
128 #define max(a,b) ((a) > (b) ? (a) : (b))
129 #ifndef HAVE_TIMESPEC_STRUCT
130 struct timespec {
131 time_t tv_sec; /* секунды */
132 long tv_nsec; /* и наносекунды */
133 };
134 #endif
135 /*
136 В функциях-обертках open(), mq_open(), sem_open() мы обрабатываем
137 дополнительные аргументы с помощью макросов va_XXX().
138 Один из аргументов имеет тип mode_t, что приводит
139 к ошибке в BSD/OS, где для этого типа используются
140 16-разрядные целые. При вызове обертки
141 компилятор преобразовывает 16-разрядное целое
142 в 32-разрядное. Поэтому и необходимо то.
143 что сделано ниже.
144 */
145 #ifdef __bsdi__
146 #define va_mode_t int
147 #else
148 #define va_mode_t mode_t
149 #endif
150 /* макросы блокировки записей */
151 #define read_lock(fd, offset, whence, len)
152 lock_reg(fd, F_SETLK, F_RDLCK, offset, whence, len)
153 #define readw_lock(fd, offset, whence, len)
154 lock_reg(fd, F_SETLKW, F_RDLCK, offset, whence, len)
155 #define write_lock(fd, offset, whence, len)
156 lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)
157 #define writew_lock(fd, offset, whence, len)
158 lock_reg(fd, F_SETLKW, F_WRLCK, offset, whence, len)
159 #define un_lock(fd, 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
Для подготовки пpoгрaмм в этой книге использовалась утилита GNU autoconf, которая помогает сделать их более переносимыми. Она доступна по адресу ftp://prep.ai.mit.edu/pub/gnu. Утилита создает сценарий configure, который следует запустить после того, как вы зaгрyзитe пpoгрaммy из Сети. Этот сценарий определяет возможности вашей системы: поддерживаются ли очереди System V, определен ли тип uint8_t, определена ли функция gethostname и т. д. В процессе работы он создает заголовочный файл config.h, который включается нашим unpipc.h перед всеми остальными. В листинге В.2 приведен пример заголовочного файла config.h для системы Solaris 2.6 и компилятора gcc.
Строки, начинающиеся с #define, описывают функции, поддерживаемые в системе. Закомментированные строки соответствуют неподдерживаемым функциям.
Листинг В.2. Заголовочный файл config.h для Solaris 2.6//sparc-sun-solaris2.6/config.h
1 /* config.h. Автоматически создается сценарием configure. */
2 /* Константы следует указывать только тогда, когда есть соответствующий заголовочный файл */
3 #define CPU_VENDOR_OS "sparc-sun-solaris2.6"
4 #define HAVE_DOOR_H 1 /* <door.h> */
5 #define HAVE_MQUEUE_H 1 /* <mqueue.h> */
6 #define HAVE_POLL_H 1 /*<poll.h>*/
7 #define HAVE_PTHREAD_H 1 /* <pthread.h> */
8 #define HAVE_RPC_RPC_H 1 /* <rpc/rpc.h> */
9 #define HAVE_SEMAPHORE_H 1 /* semaphore.h> */
10 #define HAVE_STRINGS_H 1 /* <strings.h> */
11 #define HAVE_SYS_FILIO_H 1 /* <sys/filio.h> */
12 #define HAVE_SYS_IOCTL_H 1 /* <sys/ioctl.h> */
13 #define HAVE_SYS_IPC_H 1 /* <sys/ipc.h> */
14 #define HAVE_SYS_MMAN_H 1 /* <sys/mman.h> */
15 #define HAVE_SYS_MSG_H 1 /* <sys/msg.h> */
16 #define HAVE_SYS_SEM_H 1 /* <sys/sem.h> */
17 #define HAVE_SYS_SHM_H 1 /* <sys/shm.h> */
18 #define HAVE_SYS_SELECT_H 1 /* <sys/select.h> */
19 /* #undef HAVE_SYS_SYSCTL_H */ /* <sys/sysctl.h> */
20 #define HAVE_SYS_TIME_H 1 /* <sys/time.h> */
21 /* Определена, если можно подключить <time.h> вместе с <sys/time.h> */
22 #define TIME_WITH_SYS_TIME 1
23 /* Определены, если имеются соответствующие функции */
24 #define HAVE_BZERO 1
25 #define HAVE_FATTACH 1
26 #define HAVE_POLL 1
27 /* #undef HAVE_PSELECT */
28 #define HAVE_SIGWAIT 1
29 #define HAVE_VALLOC 1
30 #define HAVE_VSNPRINTF 1
31 /* Определены, если прототипы функций есть в заголовках */
32 #define HAVE_GETHOSTNAME_PROTO 1 /* <unistd.h> */
33 #define HAVE_GETRUSAGE_PROTO 1 /* <sys/resource.h> */
34 /* #undef HAVE_PSELECT_PROTO */ /* <sys/select.h> */
35 #define HAVE SHM_OPEN_PROTO 1 /* <sys/mman.h> */
36 #define HAVE_SNPRINTF_PROTO 1 /* <stdio.h> */
37 #define HAVE_THR_SETCONCURRENCY_PROTO 1 /* <thread.h> */
38 /* Определены, если определены соответствующие структуры */
39 #define HAVE_SIGINFO_T_STRUCT 1 /* <signal.h> */
40 #define HAVE_TIMESPEC_STRUCT 1 /* <time.h> */
41 /* #undef HAVE_SEMUN_UNION */ /* <sys/sem.h> */
42 /* Устройства */
43 #define HAVE_DEV_ZERO 1
44 /* Для соответствующих типов данных */
45 /* #undef int8_t */ /* <sys/types.h> */
46 /* #undef intl6_t */ /* <sys/types.h> */
47 /* #undef int32_t */ /* <sys/types.h> */
48 /* #undef uint8_t */ /* <sys/types.h> */
49 /* #undef uintl6_t */ /* <sys/types.h> */
50 /* #undef uint32_t */ /* <sys/types.n> */
51 /* #undef size_t */ /* <sys/types.h> */
52 /* #undef ssize_t */ /* <sys/types.h> */
53 #define POSIX_IPC_PREFIX "/"
54 #define RPCGEN_ANSIC 1 /* определена, если rpcgen поддерживает параметр –С */
В.З. Стандартные функции вывода сообщений об ошибках
Мы определили свой набор функций, используемых во всех программах книги для обработки ситуаций с возникновением ошибок. Причина, по которой мы создаем эти функции, заключается в том, что теперь мы можем писать команды в одну строку:
if (условие_ошибки) err_sys(формат printf с произвольным количеством аргументов);
вместо:
if (условие_ошибки) {
char buff[200];
snprintf(buff, sizeof(buff), формат printf с произвольным количеством аргументов);
perror(buff);
exit(1);
}
Функции обработки ошибок используют возможности работы со списком аргументов переменной длины, определенные стандартом ANSI С. В разделе 7.3 [ 11 ] вы можете узнать подробности.
В таблице В.1 приведены отличия между различными функциями обработки ошибок. Если глобальное целое daemon_proc отлично от нуля, сообщение передается демону syslog с указанным уровнем (см. главу 12 [24]); в противном случае сообщение выводится в стандартный поток сообщений об ошибках.
Таблица В.1. Функции обработки ошибок
Функция strerror(errno)? Завершение? Уровень syslog err_dump Да abort(); LOG_ERR err_msg Нет return; LOG_INFO err_quit Нет exit(1); LOG_ERR err_ret Да return; LOG_INFO err_sys Да exit(1); LOG_ERRВ листинге В.3 приведен текст функций из табл. В.1.
Листинг В.3. Функции обработки ошибок//lib/error.с
1 #include "unpipc.h"
2 #include <stdarg.h> /* заголовочный файл ANSI С */
3 #include <syslog.h> /* для демона syslog() */
4 int daemon_proc; /* устанавливается отличным от нуля daemon_init() */
5 static void err_doit(int, int, const char*, va_list);
6 /* Нефатальная ошибка при системном вызове.
7 * Вывод сообщения и возврат из функции. */
8 void
9 err_ret(const char *fmt, ...)
10 {
11 va_list ар;
12 va_start(ap, fmt);
13 err_doit(1, LOG_INFO, fmt, ap);
14 va_end(ap);