apue:UNIX基础知识

来源:互联网 发布:java嵌入html5 编辑:程序博客网 时间:2024/06/06 17:52

登录

    登录UNIX系统时,先键入登录名,然后键入口令。系统在其口令文件,通常是/etc/passwd文件中查看登录名。口令文件中的登录项由7个以冒号分隔的字段组成:登录名,加密口令,数字用户ID,数字组ID,注释字段,起始目录,以及shell程序。

shell

    shell是一个命令行解释器,它读取用户输入,然后执行命令,用户通常用终端,有时则通过文件(称为shell脚本)向shell进行输入。常用的shell有:
- Bourneshell,/bin/sh
- Cshell,/bin/csh
- KornShell,/bin/ksh
    系统从口令文件中登录项的最后一个字段中了解到应该执行哪一个shell。

文件与目录

文件系统

    UNIX文件系统是目录和文件的一种层次安排,目录的起点称为根(root),其名字是一个字符/。目录(directory)是一个包含目录项的文件,在逻辑上,可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。文件属性是:文件类型,文件长度,文件所有者,文件的许可权,文件最后的修改时间等。

文件名

    目录中的各个名字称为文件名(filename)。不能出现在文件名中的字符只有两个,斜线(/)和空操作符(null)。斜线分隔构成路径名的各文件名,空操作符则终止一个路径名。当创建一个新目录时,自动创建了两个文件名:.(称为点)和..(称为点-点)。点引用当前目录,点-点则引用父目录。在最高层次的根目录中,点-点与点相同。

路径名

    0个或多个以斜线分隔的文件名序列(可以任选地以斜线开头)构成路径名(pathname),以斜线开头的路径名称为绝对路径名(absolute pathname),否则称为相对路径名(relative pathname)。

工作目录

    每个进程都有一个工作目录(working directory,有时称为当前工作目录(current working directory))。所有相对路径名都从工作目录开始解释。

起始目录

    登录时,工作目录设置为起始目录(home directory),该起始目录从口令文件中的登录项中取得。

输入和输出

文件描述符

    文字描述符是一个小的非负整数,内核用以标识一个特定进程正在存访的文件。当内核打开一个现存文件或创建一个新文件时,它就返回一个文件描述符。当读、写文件时,就可使用它。

标准输入、输出、错误

    每当运行一个新程序时,所有的shell都为其打开三个文件描述符:标准输入、标准输出以及标准错误。如果简单命令没有做什么特殊处理,则这三个描述符都连向终端。大多数shell都提供一种方法,通过符号“>”使任何一个或所有这三个描述符都能重新定向到某一个文件。

不用缓存的I/O

    函数open、read、write、lseek以及close提供了不用缓存的I/O。这些函数都用文件描述符进行工作。

标准I/O

    标准I/O函数提供一种对不用缓存的I/O函数的带缓存的界面。使用标准I/O可无需担心如何选取最佳的缓存长度,另一个使用标准I/O函数的优点与处理输入行有关(常常发生在UNIX的应用中)。

程序和进程

程序

    程序(program)是存放在磁盘文件中的可执行文件。使用6个exec函数中的一个由内核将程序读入存储器,并使其执行。

进程和进程ID

    程序的执行实例被称为进程(process)。某些操作系统用任务表示正被执行的程序。每个UNIX进程都一定有一个唯一的数字标识符,称为进程ID(process ID),进程ID总是一非负整数。

进程控制

    有三个用于进程控制的主要函数:fork、exec和waitpid(exec函数有六种变体,但经常把它们统称为exec函数)。

ANSI C

函数原型

    头文件unistd.h包含了许多UNIX系统服务的函数原型,函数原型是ANSIC标准的组成部分,提供了这些函数原型后,编译程序在编译时就可以检查在调用函数时是否使用了正确的参数。另外,因为编译程序知道参数的数据类型,所以如果可能,它就会将参数强制转换成所需的数据类型。

类属指针

    所有早期的UNIX系统都使用char*这种指针类型,ANSI C使用void*作为类属指针来代替char*。函数原型和类属指针的组合消去了很多非ANSIC编辑程序需要的显式类型强制转换。

原始系统数据类型

     以_t结尾的这些数据类型被称为原始系统数据类型,它们通常在头文件sys/types.h中定义,它们通常以Ctypedef说明加以定义,它们的目的是阻止程序使用专门的数据类型(例如int,short或long)来允许对于一种特定系统的每个实现选择所要求的数据类型。在需要存储进程ID的地方,分配类型为pid_t的一个变量。在各种不同的实现中,这种数据类型的定义可能是不同的,但是这种差别现在只出现在一个头文件中。

错误处理

    当UNIX函数出错时,往常返回一个负值,而且整型变量errno通常设置为具有特定信息的一个值,某些函数并不返回负值而是使用另一种约定。文件errno.h中定义了变量errno以及可以赋与它的各种常数,这些常数都以E开头,对于errno应当知道两条规则。第一条规则是:如果没有出错,则其值不会被一个例程清除。因此,仅当函数的返回值指明出错时,才检验其值。第二条是:任一函数都不会将errno值设置为0,在errno.h中定义的所有常数都不为0。

用户标示

用户ID

    口令文件登录项中的用户ID(userID)是个数值,它向系统标识各个不同的用户。系统管理员在确定一个用户的登录名的同时,确定其用户ID。用户不能更改其用户ID。通常每个用户有一个唯一的用户ID。用户ID为0的用户为根(root)或超级用户(superuser)。在口令文件中,通常有一个登录项,其登录名为root,我们称这种用户的特权为超级用户特权。某些操作系统功能只限于向超级用户提供,超级用户对系统有自由的支配权。

组ID

    口令文件登录项也包括用户的组ID(group ID),它也是一个数值。组ID也是由系统管理员在确定用户登录名时分配的。一般来说,在口令文件中有多个记录项具有相同的组ID。在UNIX下,组被用于将若干用户集合到课题或部门中去,这种机制允许同组的各个成员之间共享资源。组文件将组名映射为数字组ID,它通常是/etc/group。系统中每个文件的目录项包含该文件所有者的用户ID和组ID。口令文件包含了登录名和用户ID之间的映射关系,而组文件则包含了组名和组ID之间的映射关系。

信号

    信息是通知进程已发生某种条件的一种技术。进程如何处理信号有三种选择:
- 忽略该信号。有些信号表示硬件异常,因为这些异常产生的后果不确定,所以不推荐使用这种处理方式。
- 按系统默认方式处理。
- 提供一个函数,信号发生时则调用该函数。使用这种方式,我们将能知道什么时候产
生了信号,并按所希望的方式处理它。
    很多条件会产生信号,有两种键盘方式,分别称为中断键(interruptkey,通常是Delete键或Ctrl-C)和退出键(quitkey,通常是Ctrl-),它们被用于中断当前运行进程。另一种产生信号的方法是调用名为kill的函数。在一个进程中调用此函数就可向另一个进程发送一个信号。

UNIX时间值

    长期以来,UNIX系统一直使用两种不同的时间值:
1. 日历时间。该值是自1970年1月1日00:00:00以来国际标准时间(UTC)所经过的秒数累计值。这些时间值可用于记录文件最近一次的修改时间等。
2. 进程时间。这也被称为CPU时间,用以度量进程使用的中央处理机资源。进程时间以
时钟滴答计算,多年来,每秒钟取为50、60或100个滴答。
    当度量一个进程的执行时间时,UNIX系统使用三个进程时间值:
- 时钟时间。
- 用户CPU时间。
- 系统CPU时间。
    时钟时间又称为墙上时钟时间(wallclocktime)。它是进程运行的时间总量,其值与系统中同时运行的进程数有关。在我们报告时钟时间时,都是在系统中没有其他活动时进行度量的。用户CPU时间是执行用户指令所用的时间量。系统CPU时间是为该进程执行内核所经历的时间。用户CPU时间和系统CPU时间的和常被称为CPU时间。

系统调用和库函数

    所有的操作系统都提供多种服务的入口点,由此程序向内核请求服务。各种版本的UNIX都提供经良好定义的有限数目的入口点,经过这些入口点进入内核,这些入口点被称为系统调用(systemcall)。UNIX所使用的技术是为每个系统调用在标准C库中设置一个具有同样名字的函数。用户进程用标准C调用序列来调用这些函数,然后,函数又用系统所要求的技术调用相应的内核服务。从应用角度考虑,可将系统调用视作为C函数。
函数和系统调用的关系
    系统调用和库函数之间的另一个差别是:系统调用通常提供一种最小界面,而库函数通常提供比较复杂的功能。进程控制系统调用通常由用户的应用程序直接调用。

0 0
原创粉丝点击