关于unix高级环境编程 编译时的err_sys和err_quit错误

来源:互联网 发布:java多线程讲解 编辑:程序博客网 时间:2024/05/08 03:37
err_sys以及err_quit等函数不是C语言自带函数,是作者自己编写的函数。所以,想要运行书中的源代码,就必须自建一个头文件my_err.h把作者的代码拷贝进去,然后在程序中加载。



  1. #include <errno.h> /* for definition of errno */#include <stdarg.h> /* ISO C variable aruments */static void err_doit(int, int, const char *, va_list);/* * Nonfatal error related to a system call. * Print a message and return. */voiderr_ret(const char *fmt, ...){    va_list ap;    va_start(ap, fmt);    err_doit(1, errno, fmt, ap);    va_end(ap);}/* * Fatal error related to a system call. * Print a message and terminate. */voiderr_sys(const char *fmt, ...){    va_list ap;    va_start(ap, fmt);    err_doit(1, errno, fmt, ap);    va_end(ap);    exit(1);}/* * Fatal error unrelated to a system call. * Error code passed as explict parameter. * Print a message and terminate. */voiderr_exit(int error, const char *fmt, ...){    va_list ap;    va_start(ap, fmt);    err_doit(1, error, fmt, ap);    va_end(ap);    exit(1);}/* * Fatal error related to a system call. * Print a message, dump core, and terminate. */voiderr_dump(const char *fmt, ...){    va_list ap;    va_start(ap, fmt);    err_doit(1, errno, fmt, ap);    va_end(ap);    abort(); /* dump core and terminate */    exit(1); /* shouldn't get here */}/* * Nonfatal error unrelated to a system call. * Print a message and return. */voiderr_msg(const char *fmt, ...){    va_list ap;    va_start(ap, fmt);    err_doit(0, 0, fmt, ap);    va_end(ap);}/* * Fatal error unrelated to a system call. * Print a message and terminate. */voiderr_quit(const char *fmt, ...){    va_list ap;    va_start(ap, fmt);    err_doit(0, 0, fmt, ap);    va_end(ap);    exit(1);}/* * Print a message and return to caller. * Caller specifies "errnoflag". */static voiderr_doit(int errnoflag, int error, const char *fmt, va_list ap){    char buf[MAXLINE];   vsnprintf(buf, MAXLINE, fmt, ap);   if (errnoflag)       snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",         strerror(error));   strcat(buf, "\n");   fflush(stdout); /* in case stdout and stderr are the same */   fputs(buf, stderr);   fflush(NULL); /* flushes all stdio output streams */}


0 0