第一章 unix基础知识
1.1 unix体系结构
- 操作系统(也叫内核)是一种控制协调计算机硬件资源的软件,为程序运行提供环境
- 内核的接口被称作系统调用,公用函数库构建在系统调用之上
- 应用软件既可以使用系统调用,也可以使用公用函数库
- shell 是一种特殊的应用程序,他为运行其他程序提供了一个接口。
- 操作系统除了内核外还有一些其他的软件,包括系统实用程序,shell,应用软件和一些公用函数
1.3 登陆
- 登录时检查登录名所在文件系统口令文件(/etc/passwd),密码存放到另一个叫影子文件的文件中。
- 用户登录后,系统显示一些系统信息后,就载入shell程序(shell是一个和系统交互的门),用户使用哪个shell在口令文件中最后一个字段给出
1.4 文件和目录
- unix文件系统是由文件和目录组成的一种层次结构
- 文件属性由文件类型,文件大小,所有者,权限,修改时间等组成
- 创建新目录时会自动创建. 和 .. 两个文件名,表示当前和父目录
- 每个进程都有一个工作目录,所有相对路径都以工作目录开始解析,chdir可以修改其工作目录,
- 用户登陆后进入起始目录,该目录在用户口令文件中指名
1.5 输入和输出
- 文件描述符
- 内核用它来描述一个特定进程正在访问的文件,当内核打开一个已有文件或者新建一个文件时,它返回一个fd,在读写文件时使用它
- 当运行一个新程序时,所有shell为其打开三个文件描述符:标准输入,标准输出,标准错误,如果没有手动设置,这三个文件描述符都链向终端
- 不用缓冲的I/O
- 函数open(),read(),write(),lseek(),close()提供了不用缓冲的I/O,这些函数都适用文件描述符
- read()函数返回读取的自己数
- 标准I/O
- 标准I/O提供了一种对不用缓冲I/O函数带函数的接口。
- 使用标准io不用考虑如何选取缓冲区的大小,并简化输入行的处理
1.6 程序和进程
- 程序
- 程序是存放在磁盘上的某个可执行文件,exec函数可以将程序读入内存执行
- 进程
- 程序的执行实例被称作进程
- unix系统确保每个进程都有一个唯一的数字标志符,即pid
- 进程控制
- 有三个用于控制进程的函数:fork,exec(有六种变体,统称为exec),waitpid,
- 调用fork创建新进程的时候,新进程是调用进程的一个副本,调用进程叫父进程,新创建的叫子进程,fork对父进程返回新的子进程的id,对子进程返回0
- fork创建一个新进程,所以他被调用一次,但是返回两次(分别在父进程和子进程中)
- 在子进程中,调用execlp执行从标准输入读入的命令。这样就用新的程序文件替换进程原先执行的文件。
- 现场和线程id
- 一个进程内的所有线程共享同一地址空间,文件描述符,栈和进程相关属性
- 多线程之间能访问同意存储区,所以对于共享数据的访问要进行同步避免数据不一致
1.7 出错处理
- 当unix系统函数出错的受,通常会返回一个负值切整形变量errno通常被设置为具有特定信息的值
- 文件<errno.h>定义了errno以及可以赋予它的各种常量
- 在多线程环境中,每个线程都有自己的局部errno,以避免一个线程干扰另一个线程
- 出错恢复
- 出错分为两类
- 致命性和非致命性
- 致命性错误,无法执行恢复动作
- 对于非致命性错误,有时可以较妥善的进行处理,大多数非致命性错误是暂时的(如资源短缺)
- 对于资源相关的非致命性错误的典型恢复操作是延迟一段时间,然后重试 。
- 致命性和非致命性
1.8 用户标识
- 用户id
- 口令文件登陆项中的用户id是一个数值,向系统标志不同的用户
- 用户id为0的用户为超级用户,登录名为root
- 如果进程具有超级用户特权,则大多数文件权限检查都不再执行
- 组id
- 口令文件登陆项也包括用户的组id,它是一个数值,由系统管理员在指定用户登录名时分配。
- 组被用来同组之间各个成员的资源共享(比如说文件)
- 组文件将组名映射为数值的组id,组文件通常时/etc/group
- 附属组id
- 除了在口令文件中对要给登陆名指定一个组id外,大多数unix系统版本还允许一个用户属于另外一些组
1.9信号
- 信号用于通知进程发生了某种情况
- 进程有以下三种处理信号的方式
- 忽略信号
- 按系统默认方式处理
- 提供一个函数,信号发生时使用该函数,称作捕捉这个信号
- 终端键盘上有两种产生信号的额方法,分别称为中断键(interrupt key)和推出键(quit key),他们被用于中断当前进程。
- 另一种产生信号的方法时kill函数。在一个进程中调用此函数就可以向另一个进程发送一个信号
1.10 时间值
- unix使用两种时间
- 日历时间
- UTC时间从1970.1.1经过的秒数
- 进程时间
- CPU时间,度量进程使用的CPU资源。进程时间以时钟滴答计算
- 日历时间
- 当度量一个进程执行时间时,unix系统维护了3各进程时间值
- 时钟时间,又称墙上始终时间,是进程运行的时间总量,其值于系统中同时运行的进程数目有关
- 用户CPU时间,执行用户指令所用的时间量
- 系统CPU时间,该进程执行内核进程所经历的时间。
- 用户CPU时间和系统CPU时间被称为CPU时间
1.11 系统调用
- 操作系统提供服务的入口点叫系统调用
- linux3.2.0有380各系统调用
-
unix如何进行系统调用?
- unix所使用的技术是为每个系统调用在标准C库中设置一个具有同样名字的函数。用户名称用标准C调用来调用这些函数,然后函数又用系统所要求的的技术调用相应的内核服务。
- 应用程序即可以调用系统调用又可以调用库函数
- 系统调用通常提供最小接口,而库函数通常提供比较复杂的功能
第二章 unix标准及实现
2.2 unix标准化
- restrict关键字告诉编译器,哪些指针引用可以被优化。
- 标准定义一种接口的规范而不是实现,厂商采用标准转换成具体的实现。
2.5 限制
- 限制由两种
- 编译时限制,可在头文件中定义
- 运行时限制,需要调用一个函数得到
- 2.5.4
- 函数sysconf,pathconf,fpathconf
- sysconf限制是和文件或者目录无关的运行时限制
- pathconf和fpathconf是和文件目录有关的运行时限制
#include <unistd.h>
long sysconf(int name) ;
long pathconf(const char *pathname, int name) ; //用路劲名做参数
long fpathconf(int fd, int name) ; //用文件描述符作为参数
name参数是表示系统限制的常量,再apue第34页由定义
- 以SC开始的常量用于标识运行时限制sysconf的name
- 以PC开始的常量用于标识运行时限制的pathconf和fpathconf所使用的name。
网友评论