• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            分享知識

            與大家一起分享知識

            C++博客 首頁 新隨筆 聯系 聚合 管理
              19 Posts :: 3 Stories :: 45 Comments :: 0 Trackbacks

            D.3 Standard Error Functions

            We define our own set of error functions that are used throughout the text to
            ?handle error conditions. The reason for using our own error functions is to
            let us write our error handling with a single line of C code, as in

            										
            if (error condition)
                err_sys (printf format with any number of arguments);
            
            										

            instead of

            										
            if (error condition) {
                char buff [2002];
                snprintf(buff, sizeof (buff), printf format 
            ??? with any number of arguments)
            ; perror(buff); exit (1); }
            										

            Our error functions use the variable-length argument list facility from ANSI C.
            See Section 7.3 of [Kernighan and Ritchie 1988] for additional details.

            Figure D.3 lists the differences between the various error functions.
            If the global integer daemon_proc is nonzero, the message is passed to
            syslog with the indicated level; otherwise, the error is output to standard error.
            Figure D.3. Summary of our standard error functions.
            graphics/xdfig03.gif

            Figure D.4 shows the first five functions from Figure D.3.

            Figure D.4 Our standard error functions.

            lib/error.c

             1 #include    "unp.h"
             2 #include    <stdarg.h>          /* ANSI C header file */
             3 #include    <syslog.h>          /* for syslog() */
            
             4 int     daemon_proc;            /* set nonzero by daemon_init() */
            
             5 static void err_doit(int, int, const char *, va_list);
            
             6 /* Nonfatal error related to system call
             7  * Print message and return */
            
             8 void
             9 err_ret(const char *fmt, ...)
            10 {
            11     va_list ap;
            
            12     va_start(ap, fmt);
            13     err_doit(1, LOG_INFO, fmt, ap);
            14     va_end(ap);
            15     return;
            16 }
            
            17 /* Fatal error related to system call
            18  * Print message and terminate */
            
            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, ap);
            25     va_end(ap);
            26     exit(1);
            27 }
            
            28 /* Fatal error related to system call
            29  * Print message, dump core, and terminate */
            
            30 void
            31 err_dump(const char *fmt, ...)
            32 {
            33     va_list ap;
            
            34     va_start(ap, fmt);
            35     err_doit(1, LOG_ERR, fmt, ap);
            36     va_end(ap);
            37     abort();                    /* dump core and terminate */
            38     exit(1);                    /* shouldn't get here */
            39 }
            
            40 /* Nonfatal error unrelated to system call
            41  * Print message and return */
            
            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 /* Fatal error unrelated to system call
            52  * Print message and terminate */
            
            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 /* Print message and return to caller
            63  * Caller specifies "errnoflag" and "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 + 1];
            
            69     errno_save = errno;         /* value caller might want printed */
            70 #ifdef HAVE_VSNPRINTF
            71     vsnprintf(buf, MAXLINE, fmt, ap);   * safe */
            72 #else
            73     vsprintf(buf, fmt, ap);     /* not safe */
            74 #endif
            75     n = strlen(buf);
            76     if (errnoflag)
            77         snprintf(buf + n, MAXLINE - n, ": %s", strerror(errno_save));
            78     strcat(buf, "\n");
            
            79     if (daemon_proc) {
            80         syslog(level, buf);
            81     } else {
            82         fflush(stdout);         /* in case stdout and stderr are the same */
            83         fputs(buf, stderr);
            84         fflush(stderr);
            85     }
            86     return;
            87 }
            
            posted on 2006-05-09 21:39 史傳紅 閱讀(1007) 評論(0)  編輯 收藏 引用 所屬分類: 鏈接目錄
            亚洲精品无码久久久久去q | 久久成人精品| 成人a毛片久久免费播放| 久久久久亚洲精品天堂久久久久久 | 久久99精品久久只有精品| 91久久婷婷国产综合精品青草| 国产精品免费福利久久| 久久93精品国产91久久综合| 欧美亚洲国产精品久久久久| 久久久久久久亚洲Av无码| 丁香五月综合久久激情| 亚洲欧美日韩久久精品第一区| 一级做a爰片久久毛片人呢| 人人妻久久人人澡人人爽人人精品| 久久精品午夜一区二区福利| 四虎影视久久久免费观看| 国产成人精品免费久久久久| 亚洲欧美国产日韩综合久久| 精品久久久久久久久中文字幕| 亚洲国产视频久久| 国产农村妇女毛片精品久久| 国产精品久久久久久吹潮| 久久久久国产精品嫩草影院| 青青久久精品国产免费看 | 久久91这里精品国产2020| 久久综合久久自在自线精品自| 人人狠狠综合久久亚洲| 国产高潮久久免费观看| 久久久久久久综合日本亚洲| 国产∨亚洲V天堂无码久久久| 久久精品免费一区二区| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 亚洲va中文字幕无码久久| 久久久综合香蕉尹人综合网| 国产精自产拍久久久久久蜜| 久久精品九九亚洲精品天堂| 2019久久久高清456| 久久免费看黄a级毛片| 狠狠色婷婷久久一区二区| 亚洲va久久久噜噜噜久久狠狠 | 午夜不卡久久精品无码免费|