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

来源:互联网 发布:淘宝商品点击率 编辑:程序博客网 时间:2024/06/10 11:06
本人最近用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_listap)
{
    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
原创粉丝点击