这一遍内容有点多,需要分阶段小结一下,顺便可以水一篇。
首先引用一段作者的话,我们觉得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软件。