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终端登录流程

  1. init进程(PID=1)读取 /etc/ttys 文件

  2. 对每个允许登录的终端设备,init调用一次 fork

  3. 子进程执行 getty 程序

  4. getty打开终端设备,等待用户输入用户名

  5. getty调用 login 程序:

    • execle("/usr/bin/login", "login", "-p", username, (char *)0, envp);
  6. login进程:

    • 验证用户名密码
    • 设置工作目录(chdir)
    • 设置终端所有权(chown)
    • 设置组ID(setgid, initgroups)
    • 初始化环境变量(HOME, SHELL, USER, LOGNAME, PATH)
    • 切换为用户ID(setuid)
    • 执行登录shell:execl("/bin/sh", "-sh", (char *)0);
  7. 登录shell读取启动文件(.profile, .cshrc等),设置用户环境

  8. 显示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 超级服务器进程:

  1. init执行 /etc/rc shell脚本,启动精灵进程 inetd
  2. inetd等待TCP连接请求到达
  3. 当TELNET连接请求到达时,inetd fork并执行 telnetd
  4. telnetd打开伪终端设备,fork子进程
  5. 父进程处理网络通信,子进程执行login
  6. 通过伪终端进行通信

关键进程状态(图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等)
  • 设置用户环境变量

知识关联

行动点

  • 理解init/getty/login/shell的完整登录流程
  • 掌握会话和进程组的概念
  • 区分本地登录和网络登录的差异