一、UNIX体系结构
1、UNIX系统的体系结构(P1 图1-1)
2、内核的接口被称为系统调用。公用函数构建在系统调用接口之上,应用程序即可食用公用函数库,也可使用系统调用。
二、登录
1、口令文件/etc/paaswd由7个冒号分隔的字段组成,依次是:登录名、加密口令、数字用户ID、数字组ID、注释字段、其实目录(/home/sar)以及shell程序(/bin/ksh)。
2、shell(P2 图1-2)
三、文件和目录
1、文件系统
1)、UNIX文件系统是目录和文件的一种层次结构,所有东西的起点是称为根(root)的目录,这个目录的名称是一个字符“ / “。
2)、目录(directory)是一个包含目录项的文件。在逻辑上,可认为每个目录项都包含一个文件名,同时还包含说明该文件属性的信息。文件属性是指文件类型(是普通文
件还是目录等)、文件大小、文件所有者、文件权限(其他用户能否访问该文件)以及文件最后修改时间等。
2、文件名
1)、目录中的各个名字称为文件名。只有斜线(/)和空字符这两个字符不能出现在文件名中。斜线用来分隔构成路径名的各个文件,空字符则用来终止一个路径名。为了可
移植性,POSIX.1推荐将文件名限制以下字符集以内:字母(A-B,a-b)、数字、下划线、句点(.)、短横线(-)。
2)、创建新目录时会自动创建两个文件名 . (点)和 . .(点点)。点指向当前目录;点点指向父目录。
3、路径名
1)、由斜线分隔的一个或多个文件名组成的序列(也可以以斜线开头)构成路径名,以斜线开头的路径名称为绝对路径名,否则称为相对路径名。
2)、文件系统根名字(/)是一个特殊的绝对路径名,它不包含文件名。
4、工作目录
1)、没个进程都有一个工作目录,有时称其为当前工作目录。
2)、所有相对路径名都从工作目录开始解释。
5、起始目录
1)、登录时,工作目录设置为其实目录,该起始目录从口令文件中相应用户的登陆项获得。
四、输入和输出
1、文件描述符
1)、文件描述符通常是一个非负整数,内核用以标识一个特定进程正在访问的文件。
2、标准输入、标准输出和标准错误
3、不带缓冲的I/O
1)、函数open、read、write、lseek以及close提供了不带缓冲的I/O。
4、标准I/O
1)、标准I/O为那些不带缓冲的I/O函数提供了一个带缓冲的接口。使用标准I/O函数无需担心如何选取最佳的缓冲区大小。
五、程序和进程
1、程序
1)、程序是一个存储在磁盘上某个目录中的可执行文件。
2)、内核使用exec函数将程序读入内存,并执行程序。
2、进程和进程ID
1)、程序的执行实例被称为进程。
2)、UNIX系统确保每个进程都有一个惟一的数字标识符,称为进程ID。进程ID总是一个非负整数。
3、进程控制
1)、三个进程控制的主要函数:fork、exec和waitpid
4、线程和线程ID
1)、通常,一个进程只有一个控制线程——某一时刻执行的一组机器指令。
2)、一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程有关的属性。
3)、与进程相同,线程也用ID标识。但是,线程ID只在它所属的进程内起作用。
六、出错处理
1、当UNIX系统函数出错时,通常会返回一个负值,而且整型变量errno通常被设置为具有特定信息的值。文件<errno.h>中定义了errno以及可以负值与它的各种变量。
2、对errrno应当注意两条规则:
I、如果没有出错,其值不会被例程删除。因此,仅当函数的返回值指明出错时,才检验其值。
II、任何函数都不会将errno值设置为0,而且在<errno>中定义的所有变量不为0。
3、C标准函数
1)、#include<string.h>
char *strerror(int errnum);
I、strerror函数将errnum映射为一个出错信息字符串,并且返回此字符串的指针。
2)、#include<string.h>
void perror(const char *msg);
I、perror函数基于errno的当前值,在标准错误上产生一条出错信息,然后返回。
II、首先由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值得出错信息,最后是一个换行符。
4、出错恢复
1)、<errno>中出错分类:致命性的和非致命性的。
2)、致命性的的错误,无法执行恢复动作。最多能做的是在用户屏幕上打印一条出错信息或者将一条出错信息写入日志文件中,然后退出。对于非致命性错误,有事可以叫
妥善的进行处理。
3)、与资源相关的非致命性错误包括:EAGAIN、ENFILE、ENOBUFS、ENOLCK、ENOSPC、EWOULDBLOCK、有时ENOMEM也是非致命性错误。
七、用户标识
1、用户ID
1)、口令文件登录项中的用户ID是一个数值,它向系统标识各个不同的用户。
2)、用户ID为0的用户为根用户(root)或超级用户(superuser)。在口令文件中,通常有一个登录项,其登陆名为root,称这种用户的特权为超级用户特权。
2、组ID
1)、口令文件登录项也包括用户的组ID,它是一个数值。组ID也是由系统管理员在指定用户登录名时分配的。一般来说,在口令文件中有多个登录项具有相同的组ID。
2)、组文件将组名映射为数值的组ID。组文件通常是etc/group。
3、附属组ID
1)、除了口令文件中对一个登录名指定一个组ID外,大多数UNIX系统版本还允许一个用户属于另外一些组。
八、信号
1、信号用户通知进程发生了某种情况。
2、进程处理信号的3种方式
1)、忽略信号。
2)、按系统默认方式处理。
3)、提供一个函数,信号发生时调用该函数,这被称为捕捉该信号。
3、很多情况都会产生信号。终端键盘有两种产生信号的方法,分别称之为中断键和退出键,它们被用于中断当前运行的进程。另一种产生信号的方法是调用kill函数。
九、时间值
1、日历时间
1)、该值是自协调世界时间时(UTC)1970年1月1日00:00:00这个特定时间以来所经过的秒数累计值。
2)、系统基本数据类型time_t用于保存这种时间值。
2、进程时间
1)、也被称之为CPU时间,泳衣度量进程使用的中央处理器资源。进程时间以时钟滴答计算。每秒钟曾今取值为50、60、100个时钟滴答。
2)、系统基本数据类型clock_t用于保存这种时间值。
3)、当度量一个进程的执行时间时,UNIX系统为一个进程维护了3个进程时间值:
I、时钟时间:又称为墙上时间,踏实进程运行的时间总量,其值与系统中同时运行的进程数有关。
II、用户CPU时间:执行用户指令所用的时间量。
III、系统CPU时间:是为该进程执行内核程序所经过的时间。
十、系统调用和库函数