Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:

В листинге В.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);

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

  • Читать дальше
  • 1
  • ...
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: