APUE读书笔记-00预备知识(05)-预留
这里以及前面的预备知识,属于可选的内容,其实是在本人阅读并制作本书的期间,以及工作学习过程中的一些总结。添加这些内容,只是希望能够更容易地阅读并理解原书中叙述的内容;但是在添加这一部分内容的过程中,却逐渐发现,需要整理并添加到这里的预备知识变得越来越多,以致使本文与原书内容的偏离过多,并且在真正开始阅读本书正文之前,就可能让很多的读者失去了耐心。所以,这里也不再继续添加更多内容,只将目前感觉的,相对重要的部分列在这里,以后如果有可能,会对此进行追加的。为了保持章节的一致,将本节名称命名为“预留”,为了追加可能有的之后被追加的知识。_
一、系统文档信息
1、 man
手册
描述
本书中多处提及到 系统用户手册
。这里的 用户手册
概念比较模糊。一般而言,指的是通过 man
命令获取的某个部分的内容,这个命令 man
,其实就是 manual
的简写,它是获取系统某个方面的文档信息的方法之一(另一个方法是 info
,后面讲述)。
许多GNU软件包发布的时候,都会提供该程序的用户 man
手册和 info
手册,以便安装软件的时候,会将其安装的合适的位置,供用户查阅。一般来说, man
手册的内容,大多放在 /usr/man
等目录下面,这里包含许多部分内容的文档手册,运行 man
的时候会读取这里的内容,这里的文件一般以 .gz
格式压缩,有些可以直接用 less
命令察看( less
是一个用来以交互方式察看文本文件的工具,也可以察看 .gz
压缩格式的文本文件)。
通过 man
命令,我们可以查询某个命令的功能和使用方法,可以查询某个系统调用的介绍和使用方法,可以查询某个库函数的相关信息,可以查询一些系统文件的信息,以及当前系统各种其他的信息等等。所有这些信息,都会在运行 man
命令的时候,通过手册页的方式显示出来,根据其类型的不同,将各个手册页划分到不同的节(域)上;也就是说,所有通过 man
查询的信息,都属于 man
手册某一节的某个手册页。以下对每一节进行说明,每行格式为: (节号)节名,节说明
。
在Linux上,这些节的划分规定如下:
- (1) 用户命令,包含可由普通用户使用的Linux命令的手册信息。
- (2) 系统调用, 包含由内核提供的系统调用函数的手册信息。
- (3) 例程,包含库函数的手册信息。
- (4) 设备,描述/dev目录下特殊文件的手册信息。
- (5) 文件格式描述, 描述一些文件的手册信息,例如/etc/passwd。
- (6) 游戏,这个还用说吗?
- (7) 杂项,包含宏命令包,惯例等方面的信息。
- (8) 系统管理员工具,包含只能由root用户(超级用户)启动的系统管理命令的手册信息。
- (9) 其他(Linux特定),存放内核例行程序的文档。
- (n) 新文档,可能要移动到更合适节的文档。
- (o) 老文档,可能会在一段期限内保留的文档。
- (l) 本地文档,与本地特定系统相关的文档。
当使用 man
命令进行查询的时候,如果不指定要查询哪个节中的内容,则默认先从最前面的节中查询并返回第一个匹配的结果。当描述某个部分在某个节中的文档页的时候,一般有一个约定俗成的写法。例如描述 printf
函数在 man
手册中的情况,经常使用类似如下的方式: XXX 请参见printf(3)
,也就是说,使用 printf(3)
表示 man
手册第3节中的 printf
文档信息,而不是其它节的。
另外需要注意的一点就是,当使用 man
命令进行查询的时候,显示出结果之后, man
并没有完全退出,而是会在终端上自动显示出一个交互的界面,供用户翻页(因为手册页的信息可能会很多,所以一下子都显示出来用户也不便于查阅)。在这个交互界面下,我们可以使用类似"vi编辑器"的跳转命令,进行翻页、搜索、定位等,可以通过在交互界面输入 h
来查阅交互时候所有的跳转命令(其实,这个交互界面和系统中的 less
命令一样,而 less
就是用来用交互方式显示文本文件内容的命令),最后我们可以输入 q
来退出当前的查询交互界面。
举例
对于以上各个小节,其实我们最常查询的内容(查询某个命令的使用方法,查询某个函数的调用方法)大多分布在第(1),(2)节中。下面给出一些常用的使用 man
进行查询的例子。
查询 ls
命令的手册
$man ls
这样将会显示命令 ls
的用户手册,在前面“Linux命令简介”的部分,对 man
手册中某个命令行描述的大致格式进行了介绍。
查询 printf
命令的手册(指定在特定的节中查询)
$man printf
或
$man 1 printf
这里,因为有一个C库函数叫做 printf
,和这个命令同名,但是根据 man
手册的划分规则,这个 printf
函数的手册信息应当放在第3节中,而这个 printf
命令的手册信息放在第1节,所以,按照 man
命令由前向后的搜索规则可知,直接运行 man printf
会返回 printf
命令的手册信息。但是,如果系统中没有这个 printf
命令而只有 printf
库函数(几乎是不可能的)的话,按照 man
的搜索规则,会在第3节中搜索到 printf
函数的信息并显示出来,而这却不是我们想要的结果。所以我们这里指定要在第1节中(即只包含用户命令手册的节)进行查询,第1节中没有,那么就直接返回,并提示我们没有这个命令。
查询printf函数的手册
$man 3 printf
这里,我们确定了要查询 printf
函数的信息,所以,在第3节中进行查询。
查询包含 printf
的手册页的信息
$man -k printf
这里,如果我们不确定我们要查询的 printf
在哪里或者不确定要查询对象的名称,那么使用这个命令,可以在所有的 man
手册中,搜索包含 printf
关键字的文档,并将其全部列出来,供我们后面具体指定节的选择。
帮助的帮助
以上给出的就是大致使用 man
命令来查询用户手册的常用手段,更多信息,可以通过 man man
或者 info man
命令,来查看 man
命令本身的文档手册。
2、 info
手册
描述
Linux/Unix中的文档信息一般通过man手册的方式和info手册的方式进行获取。info手册又叫做在线手册,它所提供的信息一般比man用户手册更全面和详细。
通过使用info命令,系统会给我们呈现出一个类似网页方式描述的、文档的交互界面,在其中,每个部分内容被称作节点。我们可以运行类似"emacs编辑器"中的跳转命令,在阅读手册时进行节点内的翻页等跳转;还可以跳到指定的链接(菜单),可以搜索,以及在上一级下一级、上一节点下一节点之间进行节点间的跳转,还可以进行类似浏览器浏览网页时候的、上一步下一步的导航方式进行浏览,我们可以通过输入"?"来显示更多跳转命令,通过"q"退出手册交互阅读界面。
许多GNU软件包发布的时候,都会提供该程序的用户man手册和info手册,以便安装软件的时候,会将其安装的合适的位置,供用户查阅。一般来说,info手册的内容,大多放在/usr/share/doc、/usr/doc等下面,这里包含许多部分内容的文档手册,运行info的时候会读取这里的信息。
举例
info
手册的使用,比 man
要复杂的多,复杂之处在于阅读 info
文档时候的各种交互命令。下面对此进行举例:
察看 make
的 info
手册
$info info
这样,可能会显示一个 make
命令的教程,讲述 make
命令以及相关的 Makefile
的相关内容。如果系统本身没有安装这些 info
手册,也会将 make
命令的 man
手册内容以 info
形式显示出来。
进入 info
手册之后,可以通过各种交互命令来阅读其中的内容,下面给出一些基本的交互阅读命令。
info
阅读器的交互操作1
-
察看帮助
输入
h
。按照提示输入
h,应该是新手的起点,但是没有响应。但是根据 =info
手册顶行提示信息可尝试。顶行内容为:
File: info, Node: Top, Next: Getting Started, Up: (dir)
顶行实际是头部,根据每个节点的顶行信息,可以获知下个节点,上个节点以及上层节点等的信息。
底行内容如下:
--zz-Info: (info.gz)Top, 29 lines --All----***Tags out of Date ***-----------
这一行实际是高亮的状态,底行最右面如果是
All
就表示当前页包含了节点全部内容,是Top
就表示当前页还没有包含全部节点的内容。这里表示包含了全部内容。 -
进入下一个节点
输入
n
.这样进入
gettingstarted
,不用非得大写N
。这时候顶行内容为:File: info, Node: Getting Started, Next: Advanced, Prev: Top, Up: Top
-
返回上一个节点
输入
p
。 -
退出
info
输入
q
. -
键入菜单项
输入
m
.这样会在底部提示让你输入一个菜单项名
(menuitem)
,输入之后进入相应菜单,输入菜单的时候可以部分匹配(按[Tab]
可以补全)菜单在每个info
节点中都会列出来的一般以*开头。如果当前节点没有menu
那么底部也会提示你的。
假设在 gettingstarted
中,这个节点列出了许多菜单项名字,名字后面有该项菜单的简短描述
-
进入
Help
菜单项输入
m
这样再在底部提示处输入
help
(不用管大小写)。这里描述了一些帮助信息。 -
进入
Help-P
菜单项输入
m
这样再在底部输入
Help-p
,就行了。
info
阅读器的交互操作2
-
返回该菜单项的上级
输入
u
.这样会返回当前菜单节点对应的上层节点。
-
返回当前节点所在的顶级菜单
输入
t
。这样,不仅仅是上层了,而是
top
,顶级了。 -
交叉引用当前节点中给定的其它节点
输入
f <引用节点名字>
输入
f
之后,输入引用点名字,可以用?
或者[Tab]
列出所有. -
去一个指定的节点
输入
g <节点名字>
。这里可以用
[Tab]
补全。这里*
代表当前整个文件,所以可以用g *
来看当前的所有文件。 -
终止当前命令
输入
[Ctrl]g
.类似
emacs
的,输入一个错误的命令之后,或者不想继续当前的操作了,输入这个表示取消。 -
阅读的时候向下翻页若到达该节点最后一页则到下一个节点
输入
[Space]
.这里,指的是
空格键
。如果是[pagedown]
键不会到下一个节点。 -
阅读的时候向上翻页若到达该节点首一页则到上一个节点
输入
[Delete]
。或输入
[Backspace]
。如果是
[pageup]
键不会到上一个节点。 -
若屏幕乱了刷屏幕
输入
[Ctrl]l
.这样屏幕显示就正常了。
-
到达该节点的首部
输入
b
.或输入
[Home]
.这样一次性地到达该节点的开头了。这里
[Home]
似乎不管用。 -
到达该节点的尾部
输入
e
.或输入
[End]
.这里,
[End]
似乎不管用。 -
搜索一个特定的字符串
输入
s
。这样,底部提醒你要搜索的字符串,按回车会继续搜索上次的字符串,或者输入你要搜的字符串再回车。这里,如果大写
S
则不会忽略大小写了。 -
打开一个简短的帮助命令列表(未实践)
输入
?
. -
关闭当前窗口
输入
[Ctrl]x 0
仅适用多个窗口的状态.
-
切换到下一个窗口
输入
[Ctrl]x o
总结
以上给出的就是大致使用 info
查询文档手册的常用手段,更多信息,可以通过 man info
或者 info info
命令,来查看 info
命令本身的文档手册。
二、软件和软件管理
1、软件
在前面讲述“Linux系统中程序库文件简介”的时候,我们其实已经对软件的概念有了大致的了解,在这里只对其简单介绍。简单来说,软件就是我们自己写好的程序,也就是一种软件工具,可以实现特定的目的(例如编辑器工具可以编辑文件,浏览器可以上网等)。软件一般包含:配置文件,库文件和运行程序时候入口的可执行程序等。
我们经常将可执行文件,库文件这样等类似的、相对于文本文件的、无法阅读的文件格式称作二进制文件。
对于可执行文件和库文件,这两种二进制文件差别在于可执行文件由于有入口函数(例如程序员用户看到的 main
函数),所以编译之后可以直接执行;而库文件由于没有入口函数,编译出来之后无法直接运行,它们只是在之后再编译、链接、以及运行可执行文件时候,才会被使用。另外,有些程序的插件文件其实就是动态库文件,可以在程序运行的时候动态加载,让程序具有相应的扩展功能。
对于二进制文件,其实,不仅是可执行文件和库文件,我们可以暂时这样理解,包括图片,一些特殊格式的压缩包,一些特定格式的软件包等,无法通过直接用文本阅读的方式阅读的,都是二进制文件。
2、软件管理
这里,我们所说的软件管理,一般只是指软件的安装,查询,卸载。简单来说,安装就是为了让软件可以运行,将一些文件拷贝到指定位置;查询就是察看软件安装的情况;卸载就是将软件删除。我们可以通过手动方式自己管理软件,也可借助一些已有的软件管理工具来管理软件。
手动管理
对于软件管理,为便于理解,先给出一个虽然不太准确,但是比较直观的、手动管理软件的过程描述:
- 当我们获取到软件源代码之后,将软件源代码进行编译,生成最终的可执行程序以及其依赖的库。
- 将生成的库和可执行文件拷贝到机器中的系统目录中以便可以在一个统一的地方运行
- 拷贝完之后设置好一些环境变量、建立一些程序运行所需的配置文件(例如告诉系统可执行文件在哪里,到哪里查询运行依赖库,甚至是添加一些程序的菜单设置等),这样就可以运行软件了。
- 当我们不需要软件的时候,将之前拷贝的文件从系统目录中删除,并把为了配置软件而设置的一些环境变量以及菜单恢复成修改之前的状态。
对于以上的过程,其实第2-3步的过程就是对软件的安装过程。最后的第4步就是对软件的卸载。而第1步过程是根据软件源代码编译生成可用的软件,一般对于最终用户来说,可能会没有这个步骤。
从这个过程中我们可以看出,手动管理软件,优势是可以清楚地知道安装程序时在什么地方安装了哪些文件,卸载的时候也非常彻底,不会给系统留下垃圾文件;但是,却有很多缺点。
首先,对用户要求较高
用户不仅会使用软件,而且为了让软件能够正常运行,还要要知道软件是如何来的,以及如何编译,整套软件具体包含哪些文件,要分别拷贝到哪里去等等;
其次,管理过程麻烦
一切拷贝都手动进行很容易出错;再次,维护不便。因为并没有什么机制来将自己曾经手动安装的过程一一记录下来,所以如果在机器上用这种方式安装许多软件,那么很难全部记住以前究竟安装了哪些软件,安装的软件是什么版本等。
使用软件管理工具
针对以上缺点,我们简单介绍一下使用软件管理工具进行软件管理的内容。
Linux/Unix提供了一套软件管理工具,可以实现软件的编译,安装,卸载自动处理等功能。这些软件管理工具包括RedHat的 rpm
,debian的 dpkg
等。
每种软件管理工具,都提供一种方式,可以将最初的源码编译完成的软件打包成特定格式的软件包,软件包中包括运行软件所需要的可执行文件、依赖库、配置文件、以及这些文件应当部署到系统的哪个地方等等。这些软件包可以用相应的软件管理工具读取并且处理;比如查询软件包信息、安装等等。
使用这些软件管理工具管理我们的软件,最初只需要得到相应格式的软件包,(例如 rpm
软件管理工具对应的软件包是 .rpm
格式, dpkg
软件包管理工具对应的软件包是 .deb
格式),然后双击或者通过一条特殊命令就可以实现软件的安装,省去了编译和手动拷贝的麻烦,而且一般软件管理工具本身还提供了数据库,记录曾经安装过什么软件,以及软件的信息等,为软件维护也提供了方便。
以下两点,可以帮助我们更容易了解所述内容:
使用软件管理工具与不使用软件管理工具的情况
并不是所有的软件都提供相应软件管理工具管理所需的特定格式的软件包。
有些开发者会提供相应格式的二进制软件包,以便用户选择使用。有些却只发布软件的源码,后面的编译和安装需要用户自行解决也是很常见的。
使用软件管理工具的优势
使用 tar
包或 cpio
等也可以打包文件,然后通过其中的一些脚本批处理文件,来安装和卸载软件甚至比制作软件管理工具所需的软件包要简单很多。
但如果想在安装的过程中就把一套额外的软件部署完毕,那使用软件管理工具方式,通常是是更好的方法,而且其中还有数据库协助软件升级、文件校验等,结合其它基于此软件管理工具的更好的软件管理工具(例如CenterOS的 yum
软件管理工具实际基于 rpm
,而Ubuntu的 apt-get
软件管理工具实际基于 dpkg
),特别是对于最终用户,提供相应格式的软件包几乎是最佳的方法。
三、开始实践的资源
1、本地安装系统
学习本书,如果能够有一个安装好的Unix/Linux系统进行实践,效果应该更好。如果想要在自己的机器上安装相应的系统,那么可以到如下网址下载相应的系统安装文件:
- http://download.chinaunix.net/
- http://www.lupaworld.com/portal-topic-topicid-30.html
- http://www.linuxsir.org/main/
以上只是众多资源中的其中,如果网址失效,则只有在网络上查找到更多其它的可用资源了。当下载如上资源之后,则可以将系统安装到自己的机器上。具体安装过程,根据系统不同,也有所不同,这里不详细记述,可以上网查找到相关的资料。
需要注意的是:
关于分区
安装的时候,最好对Unix/Linux系统的分区概念有一定的了解。
了解如何分区,会使安装的过程更为轻松一些,而这一点在前面的“Linux文件系统以及目录结构简介”中的一些内容会有助于对此信息的了解;
关于多系统
安装Unix/Linux的时候,如果同时机器上有其他的操作系统,那么属于多系统的机器了,这时候要注意系统安装的次序。
以Linux和Windows为例,Linux在安装之后,会将之前其他操作系统的引导区域也包含进来,这样安装Linux之后,启动机器,我们可以看到选择使用Linux系统启动,还是使用其他系统启动类似的选择菜单;而如果安装了Windows之后,会将其他操作系统的引导扇区覆盖,这样启动之后,则只能进入Windows,却无法再进入其他操作系统了。
因此通常建议遵循先安装Windows后安装Linux的原则。
2、通过远程登录使用已有系统
如下给出一些远程登录的方式,可以自己搭建服务器,也可寻找网上免费的资源。以下列出的网络资源,可能有些已经不能使用,但是具体方式是类似的。
unix-center (目前已经停用)
如果不想自己在本地安装系统,感觉代价太大,那么也可以借助网络远程登陆的方式,登陆到某台提供Linux/Unix系统的服务器,进行操作。前提是,有一个远程登录的账号,以及好用的网络。这样我们就可以进行基本的操作了。
本人使用过的、感觉不错的一个资源的网址:http://www.unix-center.net/
在其中注册账号之后,可以通过其提供的远程管理工具进行登陆,并使用Linux/Unix系统。最好对这个网址中的内容阅读一遍,了解其相应的内容。
下面是一段它的叙述的摘抄:
“Unix-Center.Net的目标是为研究、学习和使用各种版本的Unix和类Unix操作系统的教师、学生和工程技术人员提供一个体验和测试各种版本的Unix和类Unix系统的软硬件平台。该平台能够为所有注册用户免费提供SSH/VNC服务,MySQL数据库服务,传统的C/C++、Java、Fortran等多种语言开发环境,基于Apache、MySQL和PHP的Web应用开发环境。简单地讲,Unix-Center.Net的注册用户可以远程登录进入多个不同的操作系统,具备自己独立的用户空间和磁盘配额,享受该操作系统上普通用户的所有权限,学习和使用各种版本的Unix和类Unix操作系统的常用命令和功能,可以将自己正在开发的应用程序上载到Unix体验中心的服务器,在不同的软硬件平台上编译和运行。”。
关于远程登录与传输
上述网址给出了一些可选的用于在window远程登录其主机、以及传输文件的工具,并有相应的使用方法,除了下面介绍的两种远程登录和传输工具,我们也可自己选择和寻找自己习惯的工具(比如teraterm登录、winscp传输等等)。
这里给出的登录工具是 putty
, 传输工具是 psftp
大致类似如下:
-
使用
putty
远程登陆假设登陆的是Ubuntu系统,那么信息如下:
PE860/Ubuntu系统: 硬件环境:1 颗双核单线程的Intel Xeon 3050芯片,CPU 主频为2.13 GHz,配置2 GB内存 软件环境:Ubuntu 6.10 机器域名:ubuntu.unix-center.net(公网),ubuntu-edu.unix-center.net(教育网) solaris.unix-center.net fedora.unix-center.net ID:vaqeteart
安装好
putty
之后,可以打开putty
,将机器的名称、用户名填写进去,这样便登录到对应的机器中了(当前,其他远程登录也可),具体putty
的使用方式也可参考putty
工具的官网。 -
使用
psftp
远程传输上述网址也提供了在我们本地机器以及其服务器上传输文件的途径,文件传输工具:
psftp
, 主机域名和ID和putty
使用的一样,具体使用方式需参见官网。
其他资源
除了上面给出的unix-center网址,也有其他网址也提供类似的远程登录服务。例如:
我们也可以自己寻找其它更好的资源。
XXX、其他
正如最开始中说明所提到的,我们不可能通过理想的“线性”方式来获取知识,这里的“预备知识”同样如此。本章中的每个小节之间并没有严格的顺序,它们之间也可能存在相互引用的情况,例如“Linux命令简介”这一小节中就引用了“预留”这一节中的用户man手册的概念等。后面的章节之间也有类似的关系,更多类似需要注意的地方还请参考前言中给出的说明,以后不再说明。
其它更多的内容,可能会在之后进行补充。接下来的内容,将是本书的正文部分。