第一章: Unix 基础知识
操作系统为其上运行的软件提供服务, 管理硬件资源. 它是一种特殊的软件, 随计算机启动而通过特殊方式启动. 严格意义的操作系统指的是内核.
下面是一个 UNIX 系统的整体组成部分:
Kernel
内核- System Call(系统调用, 图中未标出): 内核对外提供的接口.
- Library Functions(公共函数库): 基于 System Call 封装的便于使用的接口集合.
- Shell: 基于 System Call 实现的特殊应用程序, 为运行其他应用程序提供接口.
- 应用程序: 既可以使用 System Call 接口, 也可以使用 Library Function 接口.
广义的操作系统指的是: 内核 + shell + 实用程序 + 公共函数库等的集合.
系统登录
登录名
UNIX 系统登录时, 输入用户名和密码, 系统会在 password file 中查找用户名(一般是 /etc/passwd
), 在这个文件中可以看到一系列以冒号分隔的字段, 比如:
root:*:0:0:System Administrator:/var/root:/bin/sh
分别是: 登录名, 加密的密码(或不展示), UID, GID, 注释域(System Administrator
), 该用户的 Home 目录(这里是 /var/root
), 用户的默认 shell(这里是 /bin/sh
).
目前所有的系统均将用户实际密码移到了另外一个文 件, 在 C6 中会介绍一些访问密码文件的办法.
Shell
当用户登录后, 先会显示一些系统信息, 然后我们可以键入命令到 shell 程序中. shell 程序
是一个命令行解释器, 用于读取用户输入并执行命令.
用户输入一般是通过 terminal
(一种 interactive shell) 或通过一个文件(称为 shell script, 即 shell 脚本)传给 shell.
常用的 shell 包括: sh, bash, csh, zsh, ksh, tcsh 等.
系统通过用户在 passwd 中对应条目的最后一段(用户默认 shell)来找到 shell 并运行该 shell.
文件和目录(File & Directory)
文件系统(File System)
UNIX 文件系统是一个目录和文件的层次结构(树结构), 树根被称为 root
目录, root 目录的名字是 /
.
directory(目录)
是一种特殊的文件, 包含 directory entries. 我们可以从概念上将 directory entry 理解为是由: 文件名
+ 该文件属性描述信息的结构
组成.
(其在存储器上的存储结构和逻辑结构可能是不同的, UNIX 为了保证在文件有多个硬链接的情况下能正确同步文件属性, 因此没有将文件属性存储在 directory entries 中, 但逻辑结构可以像上面这样理解).
其中文件属性描述
包括: 文件类型(普通文件/目录/设备文件等), 文件大小, 文件所有者, 文件访问权限, 文件最后修改日期等.(通过 stat
及 fstat
等函数可以读取文件属性描述结构, C4 会讲).
文件名(Filename)
目录中的名字叫文件名(filename)
, 文件名不能使用字符: /
和空字符(null)
. 因为 /
用于在 pathname
中分隔文件名, 而空字符(null
或理解为 \0
) 用于 pathname
的结束.
且由于可移植性需要, POSIX.1 建议使用的文件名字符集合是: a-z
, A-Z
, 0-9
, .
, -
, _
. 当然多语言的文件名支持又是另外一个课题了(比如中文文件名).
当创建目录时, 有两个特殊文件就已经被创建了, 分别是 .
(当前目录) 以及 ..
(父目录). 对于 root
目录, ..
仍然表示 root
目录本身.
文件名长度: 目前的主流系统中, 均支持至少 255 个字符的文件名长度.
文件路径(Pathname)
Pathname 是由一个或多个 /
分隔的文件名组成. 当 Pathname 由 /
开头时, 称为绝对路径, 否则是相对路径(比如 .
或 ..
开头). 相对路径表示的文件路径是相对当前目录(current directory)而言的.