在 Ubuntu_20.04 中使用 UNIX 环境高级编程(第三版) 源码
-
下载源代码。网址如下,下载下来的压缩包为
src.3e.tar.gz
http://apuebook.com/code3e.html
-
新建一个目录,将压缩包放进去。
$ cd /home $ makedir apue_src_code # 建好路径后,将压缩包放进去
-
进入目录, 并解压缩
$ cd apue_src_code $ tar -zxvf src.3e.tar.gz
-
需要安装libbsd-dev
$ sudo apt-get install libbsd-dev
-
进入解压缩后的路径下,执行make命令
$ cd apue.3e/ $ make
-
系统报错如下,发现出错文件为devrdev.c,通过 locate 找到该文件路径,并通过vim 编辑该文件,向其添加一个头文件<sys/sysmacros.h>,然后退出。
$ locate -b devrdev.c $ vim /home/vmuser/apue_src_code/apue.3e/filedir/devrdev.c
-
再次执行 make,报错如下
-
查找并用 vim 修改buf.c文件,在原文件第89-93行,98行,104行,111行,添加条件编译代码,修改后的文件如下
$ locate --basename buf.c #查找文件路径 $ vim stdio/buf.c
修改后 buf.c 的代码如下#include "apue.h" void pr_stdio(const char *, FILE *); int is_unbuffered(FILE *); int is_linebuffered(FILE *); int buffer_size(FILE *); int main(void) { FILE *fp; fputs("enter any character\n", stdout); if (getchar() == EOF) err_sys("getchar error"); fputs("one line to standard error\n", stderr); pr_stdio("stdin", stdin); pr_stdio("stdout", stdout); pr_stdio("stderr", stderr); if ((fp = fopen("/etc/passwd", "r")) == NULL) err_sys("fopen error"); if (getc(fp) == EOF) err_sys("getc error"); pr_stdio("/etc/passwd", fp); exit(0); } void pr_stdio(const char *name, FILE *fp) { printf("stream = %s, ", name); if (is_unbuffered(fp)) printf("unbuffered"); else if (is_linebuffered(fp)) printf("line buffered"); else /* if neither of above */ printf("fully buffered"); printf(", buffer size = %d\n", buffer_size(fp)); } /* * The following is nonportable. */ #if defined(_IO_UNBUFFERED) int is_unbuffered(FILE *fp) { return(fp->_flags & _IO_UNBUFFERED); } int is_linebuffered(FILE *fp) { return(fp->_flags & _IO_LINE_BUF); } int buffer_size(FILE *fp) { return(fp->_IO_buf_end - fp->_IO_buf_base); } #elif defined(__SNBF) int is_unbuffered(FILE *fp) { return(fp->_flags & __SNBF); } int is_linebuffered(FILE *fp) { return(fp->_flags & __SLBF); } int buffer_size(FILE *fp) { return(fp->_bf._size); } #elif defined(_IONBF) #if 0 #ifdef _LP64 #define _flag __pad[4] #define _ptr __pad[1] #define _base __pad[2] #endif #endif int is_unbuffered(FILE *fp) { #if 0 return(fp->_flag & _IONBF); #else return(fp->_flags & _IOLBF); #endif } int is_linebuffered(FILE *fp) { #if 0 return(fp->_flag & _IOLBF); #else return(fp->_flags & _IOLBF); #endif } int buffer_size(FILE *fp) { #ifdef _LP64 #if 0 return(fp->_base - fp->_ptr); #endif return(fp->_IO_buf_end - fp->_IO_buf_base); #else return(BUFSIZ); /* just a guess */ #endif } #else #error unknown stdio implementation! #endif
-
再次make, 完成编译
. -
将apue.h 文件和对应的静态链接库 libapue.a 放到 系统/usr 路径下
$ sudo cp ./include/apue.h /usr/include/ $ sudo cp ./lib/libapue.a /usr/local/lib/
-
至此,可以在自己的代码中使用头文件 apue.h 进行编程开发了。