Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 [ 169 ] 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

#define

CPU VENDOR OS spare-sun-solari s2,6

#define

HAVE DOOR H 1

/* <door,h> */

#define

HAVE MQUEUE H 1

/* <mqueue.h> */

#define

HAVE POLL H 1

/* <poll.h> */

#define

HAVE PTHREAD H 1

/* <pthread.h> */

#define

HAVE RPC RPC H 1

/* <rpc/rpc.h> */

#define

HAVE SEMAPHORE H 1

/* <semaphore.h> */

#define

HAVE STRINGS h 1

/* <strings.h> */

#define

HAVE SYS FILIO H 1

/* <sys/filio.h> */

#define

HAVE SYS IOCTL H 1

/* <sys/ioctl .h> */

#define

HAVE SYS IPC H 1

/* <sys/ipc.h> */

#define

HAVE SYS MMAN H 1

/* <sys/mman,h> */

#defi ne

HAVE SYS MSG H 1

/* <sys/msg.h> */

#define

HAVE SYS SEM H 1

/* <sys/seni.h> */

#define

HAVE SYS SHM H 1

/* <sys/shni.h> */

#define

HAVE SYS SELECT H 1

/* <sys/select.h> */

/* #undef HAVE SYS SYSCTL H */

/* <sys/sysctl.h> */

#define

HAVE SYS TIME H 1

/* <sys/time.h> */

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. Функции обработки ошибок

Функция

strerror (errno) ?

Завершение?

Уровень syslog

err dump

abortO;

LOG ERR

err msg

return;

LOG INFO

err quit

exit(l);

LOG ERR

erT ret

return;

LOG INFO

err sys

exit(l);

LOG ERR

В листинге В.З приведен текст функций из табл. В.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);



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 [ 169 ] 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.