на главную | войти | регистрация | DMCA | контакты | справка | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


моя полка | жанры | рекомендуем | рейтинг книг | рейтинг авторов | впечатления | новое | форум | сборники | читалки | авторам | добавить




Листинг В.3. Функции обработки ошибок

//lib/error.с

1  #include "unpipc.h"

2  #include /* заголовочный файл ANSI С */

3  #include /* для демона 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);

15  return;

16 }


17 /* Фатальная ошибка при системном вызове.

18  * Вывод сообщения и завершение работы. */

19 void

20 err_sys(const char *fmt, ...)

21 {

22  va_list ap;

23  va_start(ap, fmt);

24  err_doit(1, LOG_ERR, fmt, ар);

25  va_end(ap);

26  exit(1);

27 }


28 /* Фатальная ошибка при системном вызове.

29  * Вывод сообщения, сохранение дампа памяти, завершение работы. */

30 void

31 err_dump(const char *fmt, ...)

32 {

33  va_list ар;

34  va_start(ap, fmt);

35  err_doit(1, LOG_ERR, fmt, ap);

36  va_end(ap);

37  abort(); /* сохранение дампа и завершение */

38  exit(1); /* досюда не должно дойти */

39 }


40 /* Нефатальная ошибка не при системном вызове.

41  * Вывод сообщения и возврат. */

42 void

43 err_msg(const char *fmt, ...)

44 {

45  va_list ap;

46  va_start(ap, fmt);

47  err_doit(0, LOG_INFO, fmt, ap);

48  va_end(ap);

49  return;

50 }


51 /* Фатальная ошибка не при системном вызове.

52  * Вывод сообщения и возврат. */

53 void

54 err_quit(const char *fmt, ...)

55 {

56  va_list ap;

57  va_start(ap, fmt);

58  err_doit(0, LOG_ERR, fmt, ap);

59  va_end(ap);

60  exit(1);

61 }


62 /* Вывод сообщения и возврат.

63  * Вызывающий указывает "errnoflag" и "level". */

64 static void

65 err_doit(int errnoflag, int level, const char *fmt, va_list ap)

66 {

67  int errno_save, n;

68  char buf[MAXLINE];

69  errno_save = errno; /* значение может понадобиться вызвавшему */

70 #ifdef HAVE_VSNPRINTF

71  vsnprintf(buf, sizeof(buf), fmt, ар); /* защищенный вариант */

72 #else

73  vsprintf(buf, fmt, ар); /* незащищенный вариант */

74 #endif

75  n = strlen(buf);

76  if (errnoflag)

77   snprintf(buf+n, sizeof(buf)-n, ": %s", strerror(errno_save));

78  strcat(buf, "\n");

79  if (daemon_proc) {

80   syslog(level, buf);

81  } else {

82   fflush(stdout); /* если stdout и stderr одинаковы */

83   fputs(buf, stderr);

84   fflush(stderr);

85  }

86  return;

87 }


В.З. Стандартные функции вывода сообщений об ошибках | UNIX: взаимодействие процессов | ПРИЛОЖЕНИЕ Г Решения некоторых упражнений