大器的系统第8篇

这一遍内容有点多,需要分阶段小结一下,顺便可以水一篇。

首先引用一段作者的话,我们觉得ta体现了Linux的先进性:

“当我们为Linux编写系统程序时,应该始终努力使它们变小,同时使它们只做一件事,并且将这件事做好。这是Linux中的关键概念之一:创建能够以简单方式与其他程序进行数据交换的小程序。”

一些基础(更新中):

Linux上终端受$PATH变量影响,默认运行/bin和/sbin,在其他文件夹中要加“./”。

gcc程序的“-o”表示自定义文件名。

rm程序是删除。

ls程序是目录。

mv程序为文件重命名。

cp程序是复制。

cat程序在终端中查看文件内容。

touch程序用来更新时间戳。

echo程序打印返回值。打印变量要加$。

ctrl+D应该也是程序,用于关闭。

void指空的,int是整数,char是字符。关于类型以后可以单独提出来水一篇,现在脑子里有点乱。

“XOPEN_SOURCE 500”,一种UNIX类标准。

系统常开的三个文件:

/dev/stdin 文件描述符0 /dev/fd/0
/dev/stdout 文件描述符1 /dev/fd/1
/dev/stderr 文件描述符2 /dev/fd/2

接口在程序中一般指函数。

关于环境:

info,man-db,manpages和build-essential都能安装,可以使用“/”、“apropos”或“whatis”查询手册里的内容。但是内容好像不全,有些内容搜索不到,尤其是第3节不全,可能是缺少manpages-posix-dev包,ta是UNIX的。

对此我们结合书中的内容得出的理解是Ubuntu这种发行版收录非自由软件,而Debian发行版对收录的非自由软件有所限制,至于Openkylin发行版则不收录非自由软件,以至于该书的3.5节在“Openkylin”中只能理解不能操作。

由此可见“开放麒麟”不是更适合家用吗?相对的“银河麒麟”对非自由软件可能更包容一些。为了应对这种情况,我们做了一个函数和库的对照表,尽量收集本书中提供的函数和相应的库。

函数和库对照表(还在更新中)

程序中的库 程序中的函数 章节
stdio.h函数C库
main()好像指读取输入 01章
printf()打印 01章
fprintf()打印 02章
dprintf()打印 02章
argc计数函数 01章
*argc数组函数 01章
if()条件函数 01章
for()递增函数 01章
while()循环函数 01章
switch()转换函数 01章
memset()清理内存 02章
fputs()标准输出 03章
scanf() 03章
circle()计算圆形面积 03章
rectangle()计算矩形面积 03章
triangle()计算三角面积 03章
stdlib.h标准计算库
atoi()字符转换成字节 01章
atof()字符转换 02章
atol()字符转换 03章
exit()退出函数 02章
getenv()? 02章
unistd.h系统调用库
getopt()获取选项 01章
getcwd()获取当前工作目录 03章
sys/types.h系统调用库
getuid()获取用户id 03章
geteuid()获取有效id 03章
getgid()获取组ID 03章
getpid()获取本进程 03章
getppid()获取父进程 03章
inode编号的ino_t 03章
sys/sysinfo.h系统调用库
这个库好像只有这一个函数 sysinfo()只能查找linux系统信息,我们暂时查不到sysinfo()的资料,不过根据相关说明感觉此函数和任务管理器有关。 03章
string.h
fget()读取字符 02章
strspn() 02章
strlen() 02章
strstr() 02章
strdup() 03章
math.h
pow()计算平方 02章/03章
chmod()设置访问权限
chown()更改所有者权

说明:手册的内容是很多的,我们也没必要把ta完全背下来,就像工具书一样,重要的是如何丰富我们的工具集,以及如何在我们需要的时候能快速查找出相关的有效信息。

有了这些我们就可以开始举一反三的改程序了。

比如书中的cube程序,也许是为了丰富实例类型,使用了返回语句,不打印标准输出,这样结果就不太直观。我们可以自行修改一下程序,使ta可以直接在终端中输出一个结果。

原程序:

#include “cube.h”

#define NUMBER 2

int main(void)

{

return cube(NUMBER);

}

修改后:

#include <stdio.h>

#include “cube.h”

#define NUMBER 4

int main(void)

{

int a;

a = cube(NUMBER);

printf(“cube is: %d\n”, a);

return 0;

}

和函数原型、头文件一起编译后可以直接输出“cube is :64”的结果。

除了“Hello,world.”,我终于能编其他程序了:)

还有个问题,关于安装GCC、GNU Make和build-essential包的。

2.0系统怎么办?我们怎么在不可变系统里安装这些包。这个问题好像贯穿在各个版本中,比如vlc在某一版中可用,然后到了下一版就不能用了。我们觉得系统的生态应该是这样的:ta要有一套比较固定的软件来满足比较常见的使用需求,这套软件会随着版本的更迭而不断增加,而不是随着版本的更迭而时有时无,你说ta是生态也行,你说ta是联盟也行,不管什么叫法都要有这么一套软件。在这个基础上,软件生态才会逐渐发展起来。换个版本要兼容之前的,不兼容就像推倒重来,难道Linux的分支还不够多吗?既然是Linux软件,就应该能在所有分支上运行。既然是Linux分支,就应该能运行所有Linux软件。