1.下载源代码

官网:http://apuebook.com/src.3e.tar.gz

2.解压源代码

解压:tar -zxvf src.3e.tar.gz

3.安装 libbsd-devel

yum install libbsd-devel

4.执行如下命令

  • cd apue.3e

  • make

  • sudo cp ./include/apue.h /usr/include/

  • sudo cp ./lib/libapue.a /usr/local/lib/

  • sudo cp ./lib/libapue.a /usr/lib/

5.创建 apueerror.h 头文件,代码如下:

#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. 
 */  
void  
err_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. 
 */  
void  
err_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. 
 */  
void  
err_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. 
 */  
void  
err_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. 
 */  
void  
err_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. 
 */  
void  
err_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 void  
err_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 */  
}

6.执行以下命令:

cp apueerror.h /usr/include/

7.引入 apueerror.h

如在实例代码中引用到err_ 相关方法,则要在代码中#include<apue.h>后增加一行:#include <apueerror.h>如:

#include "apue.h"
#include <apueerror.h>
#include <dirent.h>

int
main(int argc, char *argv[])
{
    DIR     *dp;
    struct    dirent *dirp;

    if(argc != 2)
        err_quit("usage: ls directory_name");

    if((dp = opendir(argv[1])) == NULL)
        err_sys("cant open %s",argv[1]);
    while((dirp = readdir(dp)) != NULL)
        printf("%s\n",dirp->d_name);

    closedir(dp);
    exit(0);
}

results matching ""

    No results matching ""