《转》搞定学习《unix环境高级编程…

本人最近用ubuntu11.10学习unix开发,试图运行书中的实例程序,遇到了麻烦:( 折腾了几个小时,终于搞定。以为为本人拼凑了几个博客的结果。   

        初学《UNIX环境高级编程》的朋友都会遇到一个问题,运行里面的实例(download: http://www.apuebook.com/)时就出现问题,提示 “错误:apue.h:没有那个文件或目录”.
apue.h是作者自定义的一个头文件,包括程序所需的常用头文件及出错处理函数。所以因该将它放入系统头文件中(Linux下是 /usr/include),这样gcc编译器就可以找到它了。
先去那个网站downlowd apue 的tar.gz包,然后解压至电脑中的某个目录,比如我的是在/home/user/下,然后进入解压目录 apue.2e,修改Make.defines.linux中 的WKDIR=/home/xxx/apue.2e,为WKDIR=/home/user /apue.2e,这就是我们将要make的工作目录(存放apue.2e的目录),然后再进入std目录,用vi打开linux.mk,将里面的 nawk全部改为awk,可以使用这个命令 :1.$s/nawk/awk/g (注意前面有冒号)

然后(重点注意)

在apue.2e/include/apue.h中添加一行:
#define ARG_MAX 4096
打开apue.2e/threadctl/getenv3.c和getenv1.c,添加一行:#include "apue.h"

然后 make
然后按下面的步骤做
1. 超级用户权限登入 #cd /usr/include
2. 将apue.h和error.c两个文件copy到该目录下。(apue.h位于 your_apue_path/inlcude ; error.c位于your_apue_path/lib )
以我的了路径为例:
#cp /home/ucfree/apue.2e/inlcude/apue.h .
#cp /home/ucfree/apue.2e/lib/error.c . (实现apue.h中的出错处理函数)
3. 编辑apue.h
#sudo vim apue.h
在最后一行 #endif 前面添加一行 #include “error.c”
:wq 保存,退出.
4.err_quit跟err_sys是作者自己定义的错误处理函数,需要单独定义头文件
在/usr/include 下新建一个名为myerr.h的文件
拷贝下边的内容到myerr.h(其实此头文件在原书的附录B中)
QUOTE:#include "apue.h"
#include    
#include  
static void err_doit(int, int, const char *, va_list);

void
err_ret(const char *fmt, ...)
{
    va_list     ap;
    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
}

void
err_sys(const char *fmt, ...)
{
    va_list     ap;
    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    exit(1);
}

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

void
err_dump(const char *fmt, ...)
{
    va_list     ap;
    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    abort();        
    exit(1);        
}

void
err_msg(const char *fmt, ...)
{
    va_list     ap;
    va_start(ap, fmt);
    err_doit(0, 0, fmt, ap);
    va_end(ap);
}

void
err_quit(const char *fmt, ...)
{
    va_list     ap;
    va_start(ap, fmt);
    err_doit(0, 0, fmt, ap);
    va_end(ap);
    exit(1);
}

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, " ");
   fflush(stdout);     
   fputs(buf, stderr);
   fflush(NULL);      
}
然后在你需要使用这几种错误处理函数的程序源代码里加入
#include "myerr.h"
这样你就可以运行下载的apue程序了.

 
使用源代码:

1、知道源代码的软连接与位置
sdoning@ubuntu:~/apue/apue.2e$ ll fig1.3
lrwxrwxrwx 1 sdoning sdoning 10 2010-11-27 07:27 fig1.3 -> file/ls1.c

2、进入file目录

sdoning@ubuntu:~/apue/apue.2e/file$ ls
access       devrdev.c    ftw4.c    longpath.c  seek.c       umask.c
access.c     fileflags    hello     ls1         solaris.mk   unlink
cdpwd        fileflags.c  hello.c   ls1.c       testerror    unlink.c
cdpwd.c      filetype     hole      macos.mk    testerror.c  zap
changemod    filetype.c   hole.c    mycd        uidgid       zap.c
changemod.c  freebsd.mk   linux.mk  mycd.c      uidgid.c
devrdev      ftw4         longpath  seek        umask

3、运行

sdoning@ubuntu:~/apue/apue.2e/file$ ./ls1 /home
..
sdoning
.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值