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 语言定义

1.12 小结

第二章

评论