一、UNIX基础知识
1.6 程序和进程
- 程序(program)是一个磁盘中的可执行文件,内核中用exec将程序读入内存。
- 进程(process)是程序的执行实例,也有些地方称为任务(task)
- 每个进程有唯一标志的、非负整数的进程ID(processID,通过getpid()可获取)
- 进程控制:通过fork\exec\waitpid函数控制。
- 线程:
- 通常一个进程只有一个控制线程。一个进程内的所有线程共享同一地址空间、文件描述符、栈以及相关进程属性。因为访问共享数据,所以需要采取同步措施避免不一致性。
- 线程也有一个线程ID,只在所属进程内起作用。线程模型是在进程模型建立很久之后才被引入unix系统的。
1.7 出错处理
unix系统函数出错通常返回一个负值。POSIX和ISO C将errno定义为一个整型的可变值,每个线程都有属于它自己的局部errno值防止互相干扰。C标准定义了函数:
-
char *strerror(int errnum)
:将errnum映射为一个错误信息,返回其字符串指针。 -
void perror(const char *msg)
:输出msg、冒号、空格及当前errno值对应的出错消息,最后换行。
错误分为致命的和非致命性的:致命的通常打个日志就无法做什么了,非致命的错误程序可自行考虑措施。
1.8 用户标识
- 用户ID:系统通过用户登录名确认其ID,用户ID不可变,每个用户有唯一ID。ID为0的是root或superuser,可跳过大多数文件权限检查。
- 组ID:同组ID的各用户可共享资源,文件通常是/etc/group。
- 选用数字是为了节省空间、检查效率高。口令文件里另存了映射关系,方便用户使用字符串作为名字。
- 附属组ID:大多数系统支持16个附属组,使一个用户属于组的同时,也属于另外的若干附属组。
1.9 信号
- 信号(signal)用于通知进程发生了某种情况,如被0除。信号可以被忽略、关闭程序、提供handler函数。
- 关闭:终端键盘上支持中断键(Ctrl+c)、退出键信号(Ctrl+)来中断当前进程。也可以通过kill信号,由一个进程向另一进程发送中断信号(前提我们必须是那个进程的所有者或超级用户)。
1.10 时间值
- unix系统使用过两种时间值:
- UTC 1970年至今秒数,用于记录文件最近一次修改时间。
- 进程时间:以cpu运行该进程的滴答数为计。
- 进程执行时间unix维护了三份:
- 时间时间:进程运行时间的总量,与系统同时运行的进程数有关。
- 用户CPU时间\系统CPU时间:执行用户指令、系统指令所花的系统cpu时间量。
1.11 系统调用和库函数
- 所有操作系统都提供了多种入口,由此程序向内核请求服务。各种unix实现的良好定义、数量有限的直接入口点称为系统调用(system call)。所用的技术是为每个系统调用在标准C库设置一个同名函数,通过用标准C来调用内核服务。(产生软中断进入内核的机器指令)
- 从实现角度看,库函数和系统调用有根本区别。库函数可替代但系统调用不能替换,如malloc如果不满可以使用其它的库实现内存管理。
- 库函数与系统调用另一差别是:系统调用通常提供一种最小接口,而库函数提供比较复杂的功能。
网友评论