上周末开始看《UNIX/Linux系统编程手册》这本书(豆瓣评分高达9.5),周末的时间看到第四章,觉得这本书比直接看Linux内核要好接受的多,因为从代码入手,可以更好的理解,比如第三章系统调用的讲解,如果只是理论方面可能比较枯燥,那么这本书中的代码,如何运行呢?

下载代码

这本书的主页.代码版本有两个:
Distribution version: a tarball of the source code that includes extra material not shown in the book. Probably, this is the version of the code that you want.
Book version: a tarball of the source code as it appears in the book.
可以根据自己的选择下载,我下载的是第一个版本,可以点击上面的链接下载,如果下载失败,可以去主页下载.
下载代码,解压之后,如下图所示:

在tlpi-dist目录下执行make,然后去每一个文件下单独查看,可以发现每一个.c文件都生成了对应的可执行文件.在每一个子文件夹中都有一个make文件,有关make的作用我们可以理解为我们写了.c文件要去编译, 由于要包含作者的错误打印等头文件,所以使用gcc不再像我们之前gcc -o hello hello.c这样简单,要用include包含头文件等,而makefile就比较简单,每次代码有更改直接在对应的目录下执行make,就会生成新的可执行文件.

我们以第四章一个代码,作为例子:

我们在运行程序前先新建一个hello,里面存入内容,执行,/copy会看到相应的用法,这是作者利用usageErr打印出来的内容,然后我们按照相应提示去执行,验证,当修改相应代码后,再次执行make,会重新生成可执行文件.
C语言命令行部分介绍参考我的文章C语言命令行参数介绍
关于第三章的可变参数部分,请参考我的笔记,如果有任何疑问与问题,欢迎与我交流讨论。
如果下载代码之后make出错,没有生成相应的可执行文件,请升级gcc版本,参考Segmentfault相应回答

勘误表

勘误表
英文pdf
对于代码有任何疑问都可以通过gdb 可执行文件的方式进行单步跟踪,以获得对代码的完全理解。

编译失败

官方网站中有针对各种失败情形的分析与处理,codefaq
但是许多安装针对的是debian和ubuntu,如果使用centos等系统时如何安装呢?
例如如果在debian或ubuntu系统中使用apt-get install libcap-dev,我们可以使用yum search "libcap",显示如下,由于我是centos7 64位,因此执行yum install libcap-devel.x86_64即可。

[root@centos-linux-10 ~]# yum search  "libcap"
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
============================= N/S matched: libcap ==============================
libcap-devel.i686 : Development files for libcap
libcap-devel.x86_64 : Development files for libcap
libcap-ng-devel.i686 : Header files for libcap-ng library
libcap-ng-devel.x86_64 : Header files for libcap-ng library
libcap-ng-python.x86_64 : Python bindings for libcap-ng library
compat-libcap1.i686 : Library for getting and setting POSIX.1e capabilities
compat-libcap1.x86_64 : Library for getting and setting POSIX.1e capabilities
libcap.i686 : Library for getting and setting POSIX.1e capabilities
libcap.x86_64 : Library for getting and setting POSIX.1e capabilities
libcap-ng.i686 : An alternate posix capabilities library
libcap-ng.x86_64 : An alternate posix capabilities library
libcap-ng-utils.x86_64 : Utilities for analyzing and setting file capabilities