Unix基础知识
一、Unix体系结构
Os控制计算机硬件资源,提供程序运行环境,一般称其为内核,其相对较小,位于环境的中心。
内核的接口称为系统调用(system call);公用函数库构建在系统调用接口之上;应用软件即可使用公用函数库,也可使用系统调用。Shell是一种特殊的应用程序,其为运行其它应用程序提供了一个接口。
二、登录
1.登录名
系统在其口令文件(/etc/passwd)中查看登录名。口令文件中登录项由7个以冒号分隔的字段组成,如:
Sar :x :205 :105 :Stephen Rago :/home/sar :/bin/ksh
登录名:加密口令:数值用户ID:数值组ID:注释字段 :起始目录 :shell程序
2.Shell
Shell名 | 路径 | 描述 |
Bourne shell | /bin/sh | 几乎每一个现有的Unix系统都提供Bourne shell |
Bourne-again shell | /bin/bash | 其是GNU shell,所有Linux系统都提供这种shell |
C shell | /bin/csh | 在第6版shell而非Bourne shell基础上构造。 |
Korn shell | /bin/ksh | 是Bourne shell的后继者,它首先在SVR4中提供 |
TENEX C shell | /bin/tcsh | C shell的加强版,在c shell的基础上增加了很多特征,常被用来替换c shell |
三、文件和目录
1.文件系统
Unix文件系统是目录与文件组成的一种层次结构,目录的起点称为根(root),其名字是一个字符/。目录是一个包含许多目录项的文件,在逻辑上,可以认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。文件属性指文件类型、文件大小、文件所有者、文件权限以及文件最后的修改时间等等。
2.文件名
目录中的各个名字称为文件名;不能出现在文件名中的字符只有斜线(/)和空操作符(null)。斜线用来分隔构成路径名的各文件名,空操作符用来终止一个路径名。创建新目录时会自动创建两个文件名:.和..;.指当前目录,..指父目录;在最高层次的根目录中.与..相同。几乎所有商品化的Unix系统都支持至少255个字符的文件名。
3.路径名
一个或多个以斜线分隔的文件名序列构成路径名,以斜线开头的路径名称为绝对路径名,否则称为相对路径名。
4.工作目录
每个进程都有一个工作目录,有时称为当前工作目录,所有相对路径名都从工作目录开始解释。
5.起始目录
登录时,工作目录设置为起始目录(/home/sar),该起始目录从口令文件中相应用户的登录项中取得。
四、输入和输出
1.文件描述符
文件描述符通常是一个小的非负整数,内核用其标识一个特定进程正在访问的文件。当内核打开一个已有文件或创建一个新文件时,它返回一个文件描述符。则在读、写文件时就可使用它。
2.标准输入、标准输出和标准出错
当运行一个新程序时,所有shell都为其打开三个文件描述符:标准输入(STDIN_FILENO,0)、标准输出(STDOUT_FILENO,1)和标准出错(STDERR_FILENO,2)。
3.不用缓冲的I/O
函数open、read、write、lseek以及close提供了不用缓冲的I/O,这些函数都是用文件描述符。
4.标准I/O
标准I/O函数库提供了使我们能够控制该库所使用的缓冲风格的函数。标准I/O函数提供一种对不用缓冲I/O函数的带缓冲的接口,使用标准I/O函数无需担心如何选取最佳缓冲区大小,标准I/O函数都放在<stdio.h>中。
五、程序和进程
1.程序
程序是存放在磁盘上、处于某个目录中的一个可执行文件。可使用6个exec函数中一个由内核载入存储器并使其执行之。
2.进程和进程ID
程序的执行实例称为进程;Unix系统确保每个进程都有一个唯一的数字标识符,称其为进程ID(PID),进程ID总是一非负整数。
3.进程控制
有三个用于进程控制的主要函数:fork、exec和waitpid。Exec函数有6种变体,但常统称它们为exec函数。
4.线程和线程ID
一个进程只有一个控制线程,同一时刻只执行一组机器指令。在一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性。从而各线程在访问共享数据时需要采取同步措施以避免不一致性。与进程相同,线程也用ID标识;但线程ID只在它所属进程内起作用。
六、出错处理
C标准定义了两个函数帮助打印出错信息。
#include <string.h> Char *strerror(int errnum); 返回值:指向消息字符串的指针
该函数将errnum映射为一个出错信息字符串,并返回此字符串的指针。
#include <stdio.h> void perror(const char *msg)
该函数基于errno的当前值,在标准出错上产生一条处所信息,其首先输出由msg指向的字符串,然后一个冒号,一个空格,接着是对应于errno值的出错信息,最后是一个换行符。
七、用户标识
1.用户ID
口令文件登录项中的用户ID是个数值,它向系统标识各个不同的用户。系统管理员在确定一个用户的登录名的同时,确定其用户ID;用户不能更改其用户ID;每个用户都有一个唯一的用户ID。用户ID为0的用户为根或超级用户,超级用户对系统有自由的支配权。
2.组ID
口令文件登录项也包括用户的组ID,其是一个数值。组ID也是由系统管理员在指定用户登录名时分配的;一般在口令文件中有多个记录项具有相同的组ID。组被用于将若干用户分到不用的项目组或部门中去。这种机制允许同组各成员间共享资源
八、信号
信号是通知进程已发生某种情况的一种技术。进程如何处理信号有三种选择:
(1) 忽略此信号
(2) 按系统默认方式处理,如除0操作,系统默认方式是终止该进程。
(3) 提供一个函数,信号发生时则调用该函数,这被称为捕捉该信号;只要提供自编的函数就能知道什么时候产生了该信号,并按所希望的方式处理它。
产生信号有多种:
(1) 中断键(delete/ctrl+c)或退出键(ctrl+/),被用于中断当前运行的进程。
(2) 调用名为kill的函数。在一个进程中调用此函数就可向另一个进程发送一个信号。
九、时间值
Unix系统一直使用两种不同的时间值:
(1) 日历时间:自1970年1月1日00:00:00以来国际标准时间所经过的秒数累计值。这些时间可用于记录文件最近一次的修改时间。系统用time_t来保存这种时间值。
(2) 进程时间:用以度量进程使用的cpu资源,系统用clock_t来保存这种时间值。
Unix系统使用三个进程时间值来度量一个进程的执行时间:
1. 时钟时间(real):进程运行的时间总量。
2. 用户cpu时间(user):执行用户指令(包括内核程序)时所耗时间。
3. 系统cpu时间(sys):进程执行内核程序所用时间。
用户cpu时间和系统cpu时间之和常被称为cpu时间。 (real>sys>user)
十、系统调用和库函数
应用程序调用系统调用或者库函数,而很多库函数则调用系统调用.
系统调用和库函数之间的另一个差别是:系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。