《UNIX 环境高级编程》笔记0x0:前期准备

在开始《UNIX 环境高级编程(第三版)》学习前,需要搭建一个舒适的学习环境,保证自己可以愉快地动手敲一敲其中的代码。

开发环境和代码编辑器

运行在虚拟机中的Ubuntu里的代码编辑器用起来感觉不是怎么顺手,万幸的是VSCode推出了远程编辑的功能,也就是Remote Development。自己按照教程简单地配置好就可以使用本地的VSCode编辑虚拟机里操作系统中的工程了,而且还支持插件。

image1.png


为了可以流畅地编写C代码,需要安装一下相应的插件C/C++

这样,就可以愉快地使用本地的代码编辑器了,把虚拟机界面最小化就行了。注意下图,VSCode集成终端也默认通过ssh远程登录了,所以想要在虚拟机上操作只需要一个VSCode窗口就够了,体验非常好。

image2.png


gcc以及第三方库

这本书中使用了作者自己编写的一个工具函数,需要点击这里下载。解压后,头文件在 include/apue.h 中,实现在 lib/ 下,比如 err_quit 的实现在 lib/error.c 中。

这是就需要配一下环境变量

1
2
export C_INCLUDE_PATH=/home/parallels/apue.3e/include
export EXTERNAL_FILE_PATH=/home/parallels/apue.3e/lib

/home/parallels/apue.3e/ 为我存放下载下来的那个文件夹的路径。

C_INCLUDE_PATH 是让gcc知道额外的头文件路径。配 EXTERNAL_FILE_PATH 是为了简化后期执行gcc命令中的配置。

配好这个之后,需要对VSCode的 C/C++ 插件进行一些配置,将header文件的路径加入其中,如下,见选中的部分

image3.png

这样,在编写代码时就可以非常好的自动补全体验了。先写一个测试程序,就使用书中的第一个样例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <dirent.h>
#include <apue.h>

int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dirp;

if (argc != 2)
err_quit("usage: ls directory_name");

// 打开当前目录
if ((dp = opendir(argv[1])) == NULL)
err_sys("can't open %s", argv[1]);

// 连续读取目录中的内容
while ((dirp = readdir(dp)) != NULL)
printf("%s\n", dirp->d_name);

// 释放指针
closedir(dp);
exit(0);
}

完成之后在使用gcc编译时需要添加额外的参数,如下

1
gcc ls_test.c -LDIRECTORY $EXTERNAL_FILE_PATH/error.c

$EXTERNAL_FILE_PATH 为之前已经配好的环境变量。这里加入这个的原因是因为其使用到了 error.c 中的函数

执行如下

image4.png


调试

VSCode提供了调试功能,但是需要进行相应的配置,无法想CLion一样智能。在 .vscode 中需要有两个文件需要创建和配置。自动创建这两个文件模板的方式网上有教程,这里仅记录需要添加那些内容。

tasks.json 文件中的 args 数组需要添加引入的额外库的路径,其实就是配置gcc的参数。此为编译时的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"tasks": [
{
"type": "shell",
"label": "gcc build active file",
"command": "/usr/bin/gcc",
"args": [
"-LDIRECTORY",
"/home/parallels/apue.3e/lib/error.c",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "/usr/bin"
}
}
],
"version": "2.0.0"
}

launch.json 为运行(调试)时的配置。这里还是使用前面的程序作为例子,它需要传入一个参数,所以需要在 args 数组中添加相关参数的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"version": "0.2.0",
"configurations": [
{
"name": "gcc build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": ["/"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "gcc build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}

这样子就可以对程序进行调试了

image5.png


其他

至于命令行的配置就不说了,zsh + oh-my-zsh + zsh-autosuggestions 绝对可以提升你的终端使用体验。