01文件 I/O
open / read / write / lseek / close 围绕 fd。fd 是进程文件描述符表里的整数,指向系统打开文件表项。
对可定位文件,读写按打开文件描述的偏移进行并更新它。管道、FIFO、套接字没有可定位偏移。返回值是实际传送字节数,可以小于请求——短读短写是合法现象。仅当协议要求收满指定长度时才循环补齐,并处理 EOF、错误、EINTR / EAGAIN。
dup / dup2 让两个 fd 共享同一打开文件表项(因而共享偏移)。dup2 关闭并复用目标 fd 是内部原子操作;oldfd==newfd 则不关闭,直接返回。
02进程控制与关系
fork:父返回子 PID,子返回 0,失败父得 -1 且不创建子进程。规范要求逻辑复制用户地址空间;写时复制是常见实现,不是定义。
exec 族成功则不返回,PID 不变,用户空间换成新映像。失败则原进程继续跑。wait / waitpid 回收已退出子进程;exit 之后、被 wait 之前是僵尸态。
进程组与会话用来把作业绑在一起,方便信号与终端控制。setsid:调用者若已是进程组组长则失败;成功时创建新会话并成为会话首进程/新进程组组长。具体列表以手册为准,不要默背「一切属性都复制」。
03信号
信号是发给进程的软件中断。三种处置是忽略、默认或安装处理函数;例外:SIGKILL / SIGSTOP 不能捕获、忽略,也不能阻塞。标准信号在阻塞期间置 pending,同号多次通常合并。实时信号才按规则排队——不得把「排队」概括到所有可靠信号。不可靠信号的历史语义(丢失、重置处理)不要和上述可靠语义混成一句。
kill 按 pid / 进程组投递。pause / sigsuspend 等待。处理函数只调用 POSIX async-signal-safe 集合内的函数或做原子标志记录,复杂工作转主循环。「操作短/少」不构成安全判据。
04终端概览
终端设备有规范模式与原始模式:规范模式按行缓冲、处理擦除键;原始模式把字节几乎原样交给进程。前台进程组才能读控制终端。后台读通常收到 SIGTTIN 并默认停止;若 SIGTTIN 被阻塞/忽略或进程组孤儿化,read 可失败返回 EIO。
408 点到「终端是字符设备、有阻塞与规范处理」即可。termios 逐位标志标超纲。