第一章
UNIX基础知识
1.1 引言
所有的操作系统都需要向它们运行的程序提供各种服务。通常这些服务包括执行新程序,打开文件,读文件,分配存储区以及获得当前时间等。
1.2 UNIX体系结构
在严格意义上,可将操作系统定义为一种 软件,它控制计算机硬件资源,提供程序运行环境.一般而言,我们称此种软件为内核(kernel),它相对较小,位于环境的中心.如图所示:
广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并给予计算以独有的特性。这些软件包括系统实用程序(system utilities),应用软件,shell以及公用函数库等.
1.3 登录
1. 登录名
用户在登录UNIX系统时,先键入登录名,然后输入口令(密码).系统在其口令文件(通常是/etc/passwd文件)中查看登录名.口令文件中的登录项目由7个以冒号分隔的字段组成.它们是:
登录名:加密口令:数值用户ID:数值组ID:注释字段:起始目录:shell程序
在Ubuntu 14.04 系统,口令文件如下图所示:
目前所有的系统已将加密口令移到另一个文件中.第六章将说明这种文件以及访问它们的函数.
2. shell
用户登录后,系统通常先显示一些系统信息,然后用户就可以向shell程序键入命令.shell是一个命令行解释器,它读取用户输入,然后执行命令.用户通常用终端(交互式shell),有时则通过文件(称为shell脚本,shell script)向shell进行输入.
Ubuntu桌面系统下,启动终端的快捷键是ctrl+alt+t.若要运行shell脚本,在编辑好脚本以后需要给脚本文件添加可执行权限也就是:
chmod +x scriptname
然后在命令行下输入./scriptname,便可以执行shell脚本了.
表1-1总结了常见的shell:
名 | 路径 | FreeBSD 5.2.1 | Linux 2.4.22 | Mac OS X 10.3 | Solaris 9 |
---|---|---|---|---|---|
Bourne shell | /bin/sh | * | 链接至bash | 链接至bash | * |
Bourne-again shell | /bin/bash | 可选的 | * | * | * |
C shell | /bin/csh | 链接至 tcsh | 链接至tcsh | 链接至tcsh | * |
Koen shell | /bin/ksh | * | |||
TENEX C shell | /bin/tcsh | * | * | * | * |
APUE采用的是bsh,ksh,bash三者都具有的功能.
1.4 文件和目录
1. 文件系统
UNIX文件系统是目录和文件组成的一种层次结构,目录的起点称为根(root),其名字是一个字符/.目录(directory)是一个包含许多目录项的文件,在逻辑上,可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息.
文件属性是指文件类型(是普通文件还是目录),文件大小,文件所有者,文件权限(其他用户能否访问该文件)以及文件最后的修改时间等.stat和fstat函数返回包含所有文件属性的一个信息结构.第四章将详细说明文件的各种属性,
2. 文件名
目录中的各个名字称为文件名(filename).不能出现在文件名中的字符只有斜线(/)和空操作符(null)两个.斜线用来分隔构成路径名的各文件名,空操作符则用来终止一个路径名.
创建新目录时会自动创建两个文件名: .(称为点)和 .. (点-点).点指当前目录,点-点则指父目录.在最高层次的根目录中,点和点-点相同.
3. 路径名
一个或多个以斜线分隔的文件名序列(也可以斜线开头)构成路径名(pathname),以斜线开头的路径名称为绝对路径名(absolutely pathname),否则称为相对路径名(relative pathname).相对路径名引用相对与当前目录的文件.文件系统根的名字(/)是一个特殊的绝对路径名,它不包含文件名.
程序清单 1-1 列出一个目录中的所有文件
#include "apue.h"
#include <dirent.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);
}
4. 工作目录
每个进程都有一个工作目录(working directory).有时称其为当前工作目录(current working directory).所有的相对路径名都是从工作目录开始解释的.进程可以使用chdir函数来更改其工作目录.
5. 起始目录
登录时,工作目录设置为起始目录(home directory),该起始目录从口令文件见1.3节中相应用户登录项中取得.