title: “APUE-第9章-进程关系” source: “田浩然上传的资料” original_path: “/田浩然上传的资料/电子书/Linux/UNIX环境高级编程/09.pdf” author: “Richard M. Stevens” size: “561.67 KB” pages: 36 date: “2026-09-29” method: “pdftotext提取” status: “done” tags:
- APUE
- Unix
- 进程管理
- POSIX
APUE 第9章:进程关系
概述
来自《UNIX环境高级编程》第9章,讲解进程之间的组织关系,包括进程组、会话、登录shell等核心概念。
核心内容
9.1 引言
本章重点说明:
- 进程组(process group)
- POSIX.1引进的会话期(session)新概念
- 登录shell与从它启动的所有进程之间的关系
- 与信号的关联
9.2 终端登录
9.2.1 4.3+BSD终端登录流程
-
init进程(PID=1)读取
/etc/ttys文件 -
对每个允许登录的终端设备,init调用一次
fork -
子进程执行
getty程序 -
getty打开终端设备,等待用户输入用户名
-
getty调用
login程序:execle("/usr/bin/login", "login", "-p", username, (char *)0, envp);
-
login进程:
- 验证用户名密码
- 设置工作目录(chdir)
- 设置终端所有权(chown)
- 设置组ID(setgid, initgroups)
- 初始化环境变量(HOME, SHELL, USER, LOGNAME, PATH)
- 切换为用户ID(setuid)
- 执行登录shell:
execl("/bin/sh", "-sh", (char *)0);
-
登录shell读取启动文件(
.profile,.cshrc等),设置用户环境 -
显示shell提示符,等待用户输入命令
关键进程状态(图9-3):
init → getty → login → 登录shell → 用户进程
9.2.2 SVR4终端登录
SVR4支持两种终端登录:
- getty方式:与4.3+BSD相同
- ttymon方式:SVR4新功能,属于服务存取设施(SAF)的一部分
- init是sac(服务存取控制器)的父进程
- sac调用fork,子进程执行ttymon程序
- ttymon监视配置文件中的所有终端端口
- 用户登录时fork,子进程执行登录shell
区别:登录shell的父进程是ttymon而非init。
9.3 网络登录
9.3.1 4.3+BSD网络登录
使用 inetd 超级服务器进程:
- init执行
/etc/rcshell脚本,启动精灵进程inetd - inetd等待TCP连接请求到达
- 当TELNET连接请求到达时,inetd fork并执行
telnetd - telnetd打开伪终端设备,fork子进程
- 父进程处理网络通信,子进程执行login
- 通过伪终端进行通信
关键进程状态(图9-5):
init → inetd → telnetd → login → 登录shell
(网络) (伪终端)
9.3.2 SVR4网络登录
与4.3+BSD几乎相同,但inetd由sac调用(父进程是sac而非init)。
核心概念
会话期(Session)
- 一个会话包含一个或多个进程组
- 会话是POSIX.1引入的新概念
- 控制终端:会话与控制终端关联
进程组
- 一个进程组包含一个或多个进程
- 进程组ID(PGID)标识进程组
- 可以使用
waitpid等待进程组中任意进程终止
登录Shell
- argv[0]的第一个字符是’-‘标志,表示这是登录shell
- 登录shell读取启动文件(
.profile,.cshrc等) - 设置用户环境变量
知识关联
- APUE-第8章-进程控制:进程创建、执行、终止
- APUE-第10章-信号:信号处理机制
- APUE-第19章-伪终端:网络登录中的伪终端设备
行动点
- 理解init/getty/login/shell的完整登录流程
- 掌握会话和进程组的概念
- 区分本地登录和网络登录的差异