UNIX 环境高级编程
第一章
1.1 引言
1.2 UNIX 体系结构
从底层到上层:
- 内核
- 系统调用
- 公共函数
- shell
- 应用程序
1.3 登录
/etc/passwd 定义了登录用户、口令、登录之后的起始目录
登录之后运行的 shell 取决于 /etc/passwd 文件中列出的对应 shell
常见的 shell 的种类 sh bash csh ksh tcsh
1.4 文件和目录
- 根目录 /
- 目录命名规则
- 文件名、路径名
- 进程的工作目录 默认工作目录是启动当前进程的目录,所以会有一些(PHP)框架调用 chdir 函数改变工作目录,使得框架中可以方便地无歧义地使用相对路径
- 实例 列出指定目录下的文件
1.5 输入和输出
文件描述符
就是一个非负整数用来标识一个 进程正在访问的文件
标准输入、输出、错误
每当运行新程序时,shell 都会为它开启
3
个文件描述符,就是标准输入、输出、错误
可以通过 < 和 > 以及 | 重定向输入输出到其他文件或命令- 不带缓冲的 I/O
几个 UNIX 函数提供了不带缓冲的 I/O,并且用到了文件描述符,函数(c 函数)出错,大多数情况返回 -1 - 标准 I/O (带缓冲)
1.6 程序和进程
- 每个进程都有一个唯一的进程 ID 是个非负整数。
可以用 fork、exec、waitpid 控制进程 (在 C 语言中 NULL 和 0 是等价的)
文中提到 fork 调用一次 返回两次(分别在子进程和父进程中),这里还不是很清楚 后面进行深入了解。
进程与线程
线程用线程 ID 标识,线程 ID 只在所属进程内有意义
一个进程内的所有线程共享地址空间、文件描述符、栈、进程相关属性。
由于线程共享存储区,多线程访问时要做好同步措施。
1.7 出错处理
- UNIX 系统函数出错通常返回负值,也有返回 null 的
- 可从 errno 变量中读取具体错误标识
1.8 用户标识
- 用户、用户组、附属组
- root 用户 ID 为 0
支持多个附属组(16 个以上)
1.9 信号
- 可以注册自定义函数处理信号
- 信号有系统默认的处理方式
1.10 时间值
- 日历时间
UNIX 时间戳 - 进程时间
每个进程有 3 个进程时间,分别是:时钟时间、用户 CPU 时间、系统 CPU 时间
可以使用 time -p + 命令 的形式查看运行这个命令所需的时间
1.11 系统调用和库函数
UNIX 中每个系统调用都对应一个名字相同的 C 函数(在 C 标准库中) 应用程序可以直接调用系统调用和库函数
- 系统调用使用 C 语言定义
系统调用是直接进入被和的入口点
早期操作系统使用汇编定义 - 库函数使用 C 语言定义