本教程不提供Linux环境的安装,但我可以给出一些建议。

  • WSL(WIndows子系统)-微软官方教程
  • 安装双系统或者Linux单系统。
  • 租一个Linux云服务器。
  • 虚拟机。

下载源代码

进入代码下载界面http://man7.org/tlpi/code/index.html,选择Distribution version或者Book version,直接下载。

或者我们这里使用wget下载,像这样:

wget "man7.org/tlpi/code/download/tlpi-190930-book.tar.gz"

解压下载的包

在当前目录打下面的命令:

tar -xfz tlpi-190930-book.tar.gz

这里稍微科普一下xfz的意义,这里有三个命令行参数,x代表extract(解压),f代表file(指定备份文件),z代表使用gzip解压,如果再加上v代表visible(显示操作过程)。

安装包的依赖库

安装一些依赖的库,我的系统是Ubuntu,根据BUILDING文档的要求安装依赖就好了:

sudo apt-get install libcap-dev
sudo apt-get install libacl1-dev
sudo apt-get install libselinux1-dev

编译源代码

然后进入解压出来的目录,用make编译整个项目:

cd tlpi-book
make

出现报错:

scm_cred_recv.c: In function ‘main’:
scm_cred_recv.c:20:5: error: unknown type name ‘bool’; did you mean ‘_Bool’?
     bool useDatagramSocket;
     ^~~~
     _Bool
scm_cred_recv.c:43:25: error: ‘false’ undeclared (first use in this function); did you mean ‘pause’?
     useDatagramSocket = false;
                         ^~~~~
                         pause
scm_cred_recv.c:43:25: note: each undeclared identifier is reported only once for each function it appears in
scm_cred_recv.c:48:33: error: ‘true’ undeclared (first use in this function); did you mean ‘free’?
             useDatagramSocket = true;
                                 ^~~~
                                 free
<内置>: recipe for target 'scm_cred_recv.o' failed
make[1]: *** [scm_cred_recv.o] Error 1

看来部分文件出错了,可能是作者没注意,我们帮他改过来吧。

sockets目录下的好多文件的布尔类型声明错了,第三章中讲到了书中的布尔类型引用的是

typedef enum { FALSE, TRUE } Boolean;

这句话被定义在lib\tlpi_hdr.h里。

我们需要做的就是把所有的false改成FALSE,所有的true改成TRUE,例如:

Boolean useDatagramSocket;
useDatagramSocket = FALSE;
useDatagramSocket = TRUE;

统计了一下所以出错的文件列表如下:

scm_cred_recv.c
scm_cred_send.c
scm_multi_recv.c
scm_multi_send.c
scm_rights_recv.c
scm_rights_send.c

把所有的布尔类型全部换掉就可以成功编译了。

正式开始Linux的学习。

最后,给一个我自己修改后的下载链接:tlpi-191019

Logo

更多推荐