到了Unix编程,因为之前有C语言的基础吧,看了下目录大部分内容之前都有所总结,进度应该能够加快。不过最近有点小郁闷,申请博客专家转正失败了,这也让我重新审视了自己更新博客的初心是什么。绝不是为了与自己水平不符的专家称号,而是为提升自己。我可以问心无愧的说每天都在进步,这已经是对于自己的肯定了。发完牢骚了,现在就开始Unix新篇!
一、再识
参看的是Unix 环境高级编程(第3版),在前言中讲到本书这一版中涉及的平台中有Ubuntu12.04,正好我就在用这一版本的虚拟机。然后书中示例的源码可以从 http://apuebook.com/src.3e.tar.gz 获得,建议准备一本《Unix程序员手册》作为参考手册。我整理了下如果有需要可下载:UNIX环境高级编程
二、编译
将下载后的源码拷贝到虚拟机解压,进入apue.3e目录编译。
tar -xvf src.3e.tar.gz
cd apue.3e
make
出现错误:
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE badexit2.c -o badexit2 -L../lib -lapue -pthread -lrt -lbsd
/usr/bin/ld: cannot find -lbsd
collect2: ld 返回 1
make[1]: *** [badexit2] 错误 1
make[1]:正在离开目录 `/home/tarena/project/apue.3e/threads'
make: *** [all] 错误 1
原因是系统缺乏对应的库文件,详细可 参看:关于usr/bin/ld: cannot find -lxxx问题总结解决方法:apt-get install libbsd-dev
三、使用
编译完成,但是我们的目的不只是为看源码,而是自己编写。
将头文件拷贝到系统 include 目录下。
cp /apue.3e/include/apue.h /usr/include/
拷贝 error.c 到系统 include 目录下
cp /apue.3e/lib/error.c /usr/include/
注意,这里的文件是 error.c,不是 error.h,/usr/include /目录下有一个 error.h 的头文件。
编辑 /usr/include/apue.h 文件
在文件最后 #endif 前加上包含 error.c 的代码:
#include "error.c"
然后将编写程序包含头文件。
#inlcude <apue.h>
说明:包含头文件apue.h好理解,为什么要在头文件上添加 error.c 呢?
举个例子,调用 /apue.3e/exercises/openmax.c 里的函数 open_max 编译时会出错:
/tmp/ccb3T0PH.o: In function `open_max':
openmax1.c:(.text+0x43): undefined reference to `err_sys'
collect2: ld 返回 1
查看可发现 err_sys 等一系列函数是在 error.c 下定义的,所以需要添加 error.c 到头文件。
四、root用户登录
参看:Hi3516A开发--使用root模式登录Ubuntu14.04