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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 251

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

134 #endif

135 #endif


136 /* Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· SOMAXCONN Π² <sys/socket.h>,

137    Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ядра ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π΅Π³ΠΎ ΠΊΠ°ΠΊ 5,

       хотя Π½Π° самом Π΄Π΅Π»Π΅ поддСрТиваСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС */

138 #define LISTENQ 1024 /* Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ listen() */


139 /* Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ константы */

140 #define MAXLINE  4096 /* максимальная Π΄Π»ΠΈΠ½Π° тСкстовой строки */

141 #define BUFFSIZE 8192 /* Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° для чтСния ΠΈ записи */


142 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΡ€Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для

       взаимодСйствия ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр */

143 #define SERV_PORT      9877  /* ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΈ сСрвСры TCP ΠΈ UDP */

144 #define SERV_PORT_STR "9877" /* ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΈ сСрвСры TCP ΠΈ UDP */

145 #define UNIXSTR_PATH "/tmp/unix.str" /* ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΈ сСрвСры

                                            Π΄ΠΎΠΌΠ΅Π½Π° Unix */

146 #define UNIXDG_PATH "/tmp/unix.dg" /* ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΈ сСрвСры ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°

                                          Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ Π΄ΠΎΠΌΠ΅Π½Π° Unix */

147 /* Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΠ΅ опрСдСлСния ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ прСобразования Ρ‚ΠΈΠΏΠΎΠ²

       Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ */

148 #define SA struct sockaddr


149 #define HAVE_STRUCT_SOCKADDR_STORAGE

150 #ifndef HAVE_STRUCT_SOCKADDR_STORAGE

151 /*

152  * RFC 3493: ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΡŒΠ½ΠΎ-нСзависимая структура адрСса сокСта

153  */

154 #define __SS_MAXSIZE 128

155 #define __SS_ALIGNSIZE (sizeof(int64_t))

156 #ifndef HAVE_SOCKADDR_SA_LEN

157 #define __SS_PADS1SIZE (__SS_ALIGNSIZE - sizeof(u_char) -

sizeof(sa_family_t))

158 #else

159 #define _SS_PAD1SIZE (__SS_ALIGNSIZE - sizeof(sa_family_t))

160 #endif

161 #define __SS_PAD2SIZE (__SS_MAXSIZE β€” 2*__SS_ALIGNSIZE)


162 struct sockaddr_storage {

163 #ifdef HAVE_SOCKADDR_SA_LEN

164  u_char ss_len;

165 #endif

166  sa_family_t ss_family;

167  char        __ss_pad1[__SS_PAD1SIZE];

168  int64_t     ss_align;

169  char        __ss_pad2[_SS_PAD2SIZE];

170 };

171 #endif


172 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

173 /* Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° доступ для Π½ΠΎΠ²Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² */

174 #define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)

175 /* Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° доступ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ для Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² */


176 typedef void Sigfunc(int); /* для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сигналов */


177 #define min(a, b) ((Π°) < (b) ? (a) : (b))

178 #define max(a, b) ((a) > (b) ? (a) : (b))


179 #ifndef HAVE_ADDRINFO_STRUCT

180 #include "../lib/addrinfo.h"

181 #endif


182 #ifndef HAVE_IF_NAMEINDEX_STRUCT

183 struct if_nameindex {

184  unsigned int if_index; /* 1, 2, ... */

185  char *if_name; /* имя, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ΡΡ Π½ΡƒΠ»Π΅ΠΌ: "le0", ... */

186 };

187 #endif


188 #ifndef HAVE_TIMESPEC_STRUCT

189 struct timespec {

190  time_t tv_sec; /* сСкунды */

191  long tv_nsec;  /* ΠΈ наносСкунды */

192 };

193 #endif

Π“.2. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» config.h

Для обСспСчСния пСрСносимости всСго исходного ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² тСкстС ΠΊΠ½ΠΈΠ³ΠΈ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»Π°ΡΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° GNU autoconf. Π•Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΏΠΎ адрСсу http://ftp.gnu.org/gnu/autoconf. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сцСнарий ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ configure, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π΄ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π² свою систСму. Π­Ρ‚ΠΎΡ‚ сцСнарий опрСдСляСт, ΠΊΠ°ΠΊΠΈΠ΅ свойства обСспСчиваСт ваша систСма Unix: имССтся Π»ΠΈ Π² структурС адрСса сокСта ΠΏΠΎΠ»Π΅ Π΄Π»ΠΈΠ½Ρ‹, поддСрТиваСтся Π»ΠΈ многоадрСсная ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π°, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π»ΠΈ структуры адрСса сокСта канального уровня, ΠΈ Ρ‚.Π΄. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ получаСтся Ρ„Π°ΠΉΠ» с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ config.h. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² unp.h (см. ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»). Π’ листингС Π“.2 ΠΏΠΎΠΊΠ°Π·Π°Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» config.h для BSD/OS 3.0.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с #define, относятся ΠΊ Ρ‚Π΅ΠΌ свойствам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ обСспСчСны Π΄Π°Π½Π½ΠΎΠΉ систСмой. Π—Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ строки ΠΈ строки, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с #undef, относятся ΠΊ свойствам, Π΄Π°Π½Π½ΠΎΠΉ систСмой Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΌ.

Листинг Π“.2. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» config.h для BSD/OS

i386-pc-bsdi3.0/config.h

 1 /* config.h. АвтоматичСски гСнСрируСтся сцСнариСм configure. */

 2 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ константы, Ссли имССтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» */

 3 #define CPU_VENDOR_OS "i386-pc-bsdi3.0"

 4 /* #undef HAVE_NETCONFIG_H */ /* <netconfig.h> */

 5 /* #undef HAVE_NETDIR_H */    /* <netdir.h> */

 6 #define HAVE_PTHREAD_H 1      /* <pthread.h> */

 7 #define HAVE_STRINGS_H 1      /* <strings.h> */

 8 /* #undef HAVE_XTI_INET_H */  /* <xti_inet.h> */

 9 #define HAVE_SYS_FILIO_H 1    /* <sys/filio.h> */

10 #define HAVE_SYS_IOCTL_H 1    /* <sys/ioctl.h> */

11 #define HAVE_SYS_SELECT_H 1   /* <sys/select.h> */

12 #define HAVE_SYS_SOCKIO_H 1   /* <sys/sockio.h> */

13 #define HAVE_SYS_SYSCTL_H 1   /* <sys/sysctl.h> */

14 #define HAVE_SYS_TIME_H 1     /* <sys/time.h> */


15 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Ссли ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ <time.h> ΠΈ <sys/time.h> */

16 #define TIME_WITH_SYS_TIME 1


17 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ссли ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ */

18 #define HAVE_BZERO 1

19 #define HAVE_GETHOSTBYNAME2 1

20 /* #undef HAVE_PSELECT */

21 #define HAVE_VSNPRINTF 1


22 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ссли ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΅ΡΡ‚ΡŒ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ */

23 /* #undef HAVE_GETADDRINFO_PROTO */    /* <netdb.h> */

24 /* #undef HAVE_GETNAMEINFO_PROTO */    /* <netdb.h> */

25 #define HAVE_GETHOSTNAME_PROTO 1       /* <unistd.h> */

26 #define HAVE_GETRUSAGE_PROTO 1         /* <sys/resource.h> */

27 #define HAVE_HSTRERROR_PROTO 1         /* <netdb.h> */

28 /* #undef HAVE_IF_NAMETOINDEX_PROTO */ /* <net/if.h> */

29 #define HAVE_INET_ATON_PROTO 1         /* <arpa/inet.h> */

30 #define HAVE_INET_PTON_PROTO 1         /* <arpa/inet.h> */

31 /* #undef HAVE_ISFDTYPE_PROTO */       /* <sys/stat.h> */

32 /* #undef HAVE_PSELECT_PROTO */        /* <sys/select.h> */

33 #define HAVE_SNPRINTF_PROTO 1          /* <stdio.h> */

34 /* #undef HAVE_SOCKATMARK_PROTO */     /* <sys/socket.h> */


35 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ структуры */

36 /* #undef HAVE_ADDRINFO_STRUCT */     /* <netdb.h> */

37 /* #undef HAVE_IF_NAMEINDEX_STRUCT */ /* <net/if.h> */

38 #define HAVE_SOCKADDR_DL_STRUCT 1     /* <net/if_dl.h> */

39 #define HAVE TIMESPEC STRUCT 1        /* <time.h> */


40 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ссли имССтся ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ свойство */

41 #define HAVE_SOCKADDR_SA_LEN 1    /* Π² sockaddr{} Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ sa_len */

42 #define HAVE_MSGHDR_MSG_CONTROL 1 /* Π² msghdr{} Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ msg_control */


43 /* ИмСна устройств XTI для TCP ΠΈ UDP */

44 /* #undef HAVE_DEV_TCP */               /* Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ здСсь */

45 /* #undef HAVE_DEV_XTI_TCP */           /* для AIX */

46 /* #undef HAVE_DEV_STREAMS_XTISO_TCP */ /* для OSF 3.2 */


47 /* ΠŸΡ€ΠΈ нСобходимости опрСдСляСм Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… */

48 /* #undef int8_t */             /* <sys/types.h> */

49 /* #undef int16_t */            /* <sys/types.h> */

50 /* #undef int32_t */            /* <sys/types.h> */

51 #define uint8_t unsigned char   /* <sys/types.h> */

52 #define uint16_t unsigned short /* <sys/types.h> */

53 #define uint32_t unsigned int   /* <sys/types.h> */

54 /* #undef size_t */             /* <sys/types.h> */

55 /* #undef ssize_t */            /* <sys/types.h> */

56 /* socklen_t Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ uint32_t, Π½ΠΎ configure опрСдСляСт Π΅Π³ΠΎ

57    ΠΊΠ°ΠΊ unsigned int. Ρ‚. ΠΊ. это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π½Π°Ρ‡Π°Π»Π΅ компиляции.

58    ΠΈΠ½ΠΎΠ³Π΄Π° Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π² Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ опрСдСляСтся Ρ‚ΠΈΠΏ uint32_t */

59 #define socklen_t unsigned int  /* <sys/socket.h> */

60 #define sa_family_t SA_FAMILY_T /* <sys/socket.h> */

61 #define SA_FAMILY_T uint8_t


62 #define t_scalar_t int32_t /* <xti.h> */

63 #define t_uscalar_t uint32_t /* <xti.h> */


64 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, Ссли систСма ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ свойство */

65 #define IPV4 1       /* IPv4, V Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС */

66 #define IPv4 1       /* IPv4, v Π² Π½ΠΈΠΆΠ½Π΅ΠΌ рСгистрС, Π½Π° всякий случай */

67 /* #undef IPV6 */    /* IPv6, V Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС */

68 /* #undef IPv6 */    /* IPv6, v Π² Π½ΠΈΠΆΠ½Π΅ΠΌ рСгистрС, Π½Π° всякий случай */

69 #define UNIXDOMAIN 1 /* Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ сокСты Unix */

70 #define UNIXdomain 1 /* Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ сокСты Unix */

71 #define MCAST 1      /* ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ */

Π“.3. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок

Π’ этой ΠΊΠ½ΠΈΠ³Π΅ ΠΌΡ‹ опрСдСляСм Π½Π°Π±ΠΎΡ€ своих собствСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ создаСм эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠΉ строки ΠΊΠΎΠ΄Π°, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

if (условиС ошибки)

 err_sys(Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ printf Ρ Π»ΡŽΠ±Ρ‹ΠΌ количСством Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²);

вмСсто

if (условиС ошибки) {

 char buff[200];

 snprintf(buff, sizeof(buff), Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ printf Ρ Π»ΡŽΠ±Ρ‹ΠΌ количСством Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²);

 perror(buff);

 exit(1);

}

Наши Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ANSI Π‘: список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± этом Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 7.3 ΠΊΠ½ΠΈΠ³ΠΈ [68].