第一章 UNIX基础知识
操作系统有两个含义:
1. 仅指内核,它控制计算机硬件资源,提供程序运行环境。
2. 广义上,包括内核和一些其它软件,如系统实用程序、应用软件、shell以及公用函数库等。
文件与目录
UNIX文件系统的大多数实现并不在目录项中存放属性。有inode就够。
程序的正确性是由硬件->内核->系统调用->标准库函数->第三方库->程序员 逐步保证的。
程序与进程
程序是存放在磁盘上,处于某个目录中的一个可执行文件。使用6个exec函数中的一个由内核将程序读入存储器,并使其执行。
有三个用于进程控制的主要函数:fork、exec和waitpid。
线程和线程ID
通常,一个进程只有一个控制线程,同一时刻只执行一组机器指令。
在一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与进程相关的属性。因为它们能访问同一存储区,所以各线程在访问共享数据时需要采取同步措施以避免不一致性。
出错处理
当UNIX函数出错时,一般返回一个负值,而且整型变量errno通常被设置为含有附加信息的一个值。
返回一个指向对象指针的大多数函数,在出错时,将返回一个null指针。
POSIX和ISO C将errno定义为这样一个符号,它扩展成为一个可修改的整型左值(lvalue)。这可以是包含出错编号的一个函数,或者是一个返回出错编号指针的函数。
extern int * _errnolocation(void);
#define errno (*_errnolocation())
在支持多线程的环境中,多个线程共享进程地址空间,每个线程都有属于它自己的局部errno以避免一个线程干扰另一个线程。
对于errno应当知道两条规则:
1. 如果没有出错,则其值不会被一个例程清除。因此,仅当函数的返回值指明出错时,才检验其值。
2. 任一函数都不会将errno值设为0,在中定义的所有常量都不为0。
用户标识
对于权限,使用数值用户ID和数值值ID是历史上形成的。1是数字比字符串的存储空间小,每个文件都会存放用户ID和组ID;2是查验权限期间,比较整数更快。
信号
信号是通知进程已发生某种情况的一种技术。
进程处理信息有三种选择:
1. 忽略信号。
2. 按系统默认方式处理。
3. 提供一个信号捕捉函数,自定义处理。
在键盘上产生信号的办法,中断键盘(Ctrl+C)和退出键(Ctrl+)。
时间值
长期以来,UNIX系统一直使用两种不同的时间值。
1. 日历时间。自1970年1月1日00:00:00以来UTC所经过的秒数。
2. 进程时间。也被称为CPU时间,用来度量进程使用的中央处理器资源。
1. 时钟时间
2. 用户CPU时间
3. 系统CPU时间。