Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 122

Автор Уильям БтивСнс

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);