操作系统

Book Notes · APUE · Interfaces

UNIX 环境高级编程
接口语义深读

本页管 POSIX / Unix 接口怎么用、返回值怎么解释。异常四类、缺页路径、并发模型见 CSAPP 相关章(机制原理)。速查卡片见 syscalls 图谱。三页互补,不重复啃同一段。

01文件 I/O

open / read / write / lseek / close 围绕 fd。fd 是进程文件描述符表里的整数,指向系统打开文件表项。

对可定位文件,读写按打开文件描述的偏移进行并更新它。管道、FIFO、套接字没有可定位偏移。返回值是实际传送字节数,可以小于请求——短读短写是合法现象。仅当协议要求收满指定长度时才循环补齐,并处理 EOF、错误、EINTR / EAGAIN。

open→fd→read / write→close

dup / dup2 让两个 fd 共享同一打开文件表项(因而共享偏移)。dup2 关闭并复用目标 fd 是内部原子操作;oldfd==newfd 则不关闭,直接返回。

02进程控制与关系

fork:父返回子 PID,子返回 0,失败父得 -1 且不创建子进程。规范要求逻辑复制用户地址空间;写时复制是常见实现,不是定义。

exec 族成功则不返回,PID 不变,用户空间换成新映像。失败则原进程继续跑。wait / waitpid 回收已退出子进程;exit 之后、被 wait 之前是僵尸态。

fork→exec→wait

进程组与会话用来把作业绑在一起,方便信号与终端控制。setsid:调用者若已是进程组组长则失败;成功时创建新会话并成为会话首进程/新进程组组长。具体列表以手册为准,不要默背「一切属性都复制」。

分工:本页写返回值、继承范围、僵尸/孤儿的接口语义。CSAPP 写四类异常和「为什么会走进内核」。图谱给一张卡的速查。

03信号

信号是发给进程的软件中断。三种处置是忽略、默认或安装处理函数;例外:SIGKILL / SIGSTOP 不能捕获、忽略,也不能阻塞。标准信号在阻塞期间置 pending,同号多次通常合并。实时信号才按规则排队——不得把「排队」概括到所有可靠信号。不可靠信号的历史语义(丢失、重置处理)不要和上述可靠语义混成一句。

kill 按 pid / 进程组投递。pause / sigsuspend 等待。处理函数只调用 POSIX async-signal-safe 集合内的函数或做原子标志记录,复杂工作转主循环。「操作短/少」不构成安全判据。

易错:不要把信号写成「第五类硬件异常」。在 CSAPP 口径里,信号属于更宽的异常控制流,不是 exception 四类之一。

04终端概览

终端设备有规范模式与原始模式:规范模式按行缓冲、处理擦除键;原始模式把字节几乎原样交给进程。前台进程组才能读控制终端。后台读通常收到 SIGTTIN 并默认停止;若 SIGTTIN 被阻塞/忽略或进程组孤儿化,read 可失败返回 EIO。

408 点到「终端是字符设备、有阻塞与规范处理」即可。termios 逐位标志标超纲。

章末自测

不一定。短读是合法现象。只有约定要收满时才循环,并区分 EOF、错误和 EINTR/EAGAIN。
不能。用户空间被新映像替换,成功路径不返回。PID 仍是原来的进程。
APUE:接口语义与返回值。CSAPP:异常/虚存/并发的机制。图谱:一张卡的速查。对口径以全书与图谱已修正文本为准。