项目简介
本项目是《Advanced Programming in the UNIX Environment se2》的源代码及问题解决方案。代码文件围绕UNIX或Linux系统的多种任务展开,涵盖操作系统接口、文件操作、进程间通信、信号处理、伪终端管理、多线程编程和终端控制模式等,展示了C语言在Unix/Linux环境下的丰富应用。
项目的主要特性和功能
- 提供多种操作系统接口相关代码,可处理命令行参数、文件描述符和锁定等。
- 包含文件操作代码,实现简单的文件读写。
- 具备进程间通信和信号处理功能,能处理信号和中断。
- 有伪终端管理代码,可创建和配置伪终端对。
- 提供多线程编程和终端控制模式的实现。
- 包含数据库相关代码,可创建和管理数据库。
安装使用步骤
编译步骤
- 在http://www.apuebook.com/下载src.tar.gz源代码的压缩包。
- 修改 Make.defines.linux中的WKDIR为解压后apue.2e文件夹所在路径,如
WKDIR=/home/kolya/Downloads/
。 - 修改 apue.2e下 std/linux.mk,将所有nawk改为awk。
- 返回apue.2e,执行make。
解决编译错误
错误1
gcc -DLINUX -ansi -I/home/kolya/Downloads/apue.2e/include -Wall -D_GNU_SOURCE -DDEBUG -c -o printd.o printd.c
In file included from printd.c:6:0:
ipp.h:122:17: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘.’ token
#define status u.st
^
解决方法:在apue.2e/ipp/ipp.h中定义的宏定义status和/usr/include/i386-linux-gnu/bits/timex.h中的成员status冲突,修改apue.2e/ipp/ipp.h文件中的宏名称,例如改为status_apue,即 #define status_apue u.st
,然后将apue.2e/ipp/printd.c中977行的 hp->status
改为 hp->status_apue
。
错误2
gcc -DLINUX -ansi -I/home/kolya/Downloads/apue.2e/include -Wall -D_GNU_SOURCE -c -o getenv1.o getenv1.c
getenv1.c:4:20: error: ‘ARG_MAX’ undeclared here (not in a function)
static char envbuf[ARG_MAX];
解决方法:在apue.2e/include/apue.h中添加一行 #define ARG_MAX 4096
,打开apue.2e/threadctl/getenv1.c 和apue.2e/threadctl/getenv3.c,添加一行 #include "apue.h"
。
安装头文件和库文件
make成功后会在 apue.2e/lib下生成libapue.a等文件,执行以下命令:
sudo cp .../apue.2e/include/apue.h /usr/include
sudo cp .../apue.2e/lib/libapue.a /usr/lib/
sudo cp .../apue.2e/db/apue_db.h /usr/include
sudo cp .../apue.2e/db/libapue_db.a /usr/lib/
编译书中例子
之后编译书中例子时,要将 #include "apue.h"
改为 #include <apue.h>
,同时编译时要链接libapue,例如:
kolya@asus ~/src/APUEse2/chap1_UNIX_System_Overview $ gcc 1-1.c -o 1-1 -lapue
编译第20章数据库相关程序
编译第20章数据库相关程序时,将 #include "apue_db.h"
改为 #include <apue_db.h>
,链接时除了加上libapue.a,还要链接libapue_db.a。
注意事项
若 -lapue
写在了源程序的前面会出现错误,例如 gcc ls1.c -o ls1 -lapue
,因为 .a
在链接的时候,必须放在文件之后,.so
在链接的时候,对位置没有要求,前后都可以。
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】