《UNIX环境高级编程》(APUE) 笔记第九章 - 进程关系
9 - 进程关系
1. 进程组
每个进程除了有一个 进程 ID 外,还属于一个 进程组 。进程组是一个或多个进程的 集合 ,通常,它们是在同一作业中结合起来的,同一进程组中的各进程接受来自同一终端的各种信号。每一个进程组有一个唯一的 进程组 ID 。
函数 getpgrp 返回调用进程的进程组 ID:
#include <unistd.h>
pid_t getpgrp(void); //返回值:调用此函数的进程的进程组ID
函数 getpgid 用于获取指定 \(pid\) 进程的进程组 ID:
#include <unistd.h>
pid_t getpgid(pid_t pid); //返回值:若成功,返回进程组ID;若出错,返回-1
getpgid(0) 等价于 getpgrp() 。
每个进程有一个 组长进程 ,组长进程的进程组 ID ,等于其进程 ID 。进程组组长可以创建一个进程组、创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,与组长进程是否终止无关。从进程组创建开始到其中最后一个进程离开为止的时间区间称为 进程组的生命期 。
进程调用 setpgid 可以加入一个现有的进程组或创建一个新进程组:
#include <unistd.h>
int setpgid(pid_t pid, pid_t pgid); //返回值:若成功,返回0,;若出错,返回-1
- setpgid 将 \(pid\) 进程组ID 设置为 \(pgid\)
- 如果这两个参数相等,则由 \(pid\) 指定的进程变成进程组组长
- 如果 \(pid\) 是 \(0\) ,则使用调用者的进程ID
- 如果 \(pgid\) 是 \(0\) ,则由 \(pid\) 指定的 进程ID 用作 进程组ID
一个进程只能为 它自己或它的子进程 设置进程组ID。在它的子进程调用 exec 后,它就不再更改该子进程的进程组 ID。
2. 会话
会话 (session) 是一个或多个进程组的集合。通常是shell的 管道 将几个进程编成一组的。

进程调用 setsid 函数建立一个新会话:
#include <unistd.h>
pid_t setsid(void); //返回值:若成功,返回进程组ID;若出错,返回-1.
- 如果调用此函数的进程不是一个进程组的组长,则此函数会创建一个新会话。具体会发生:
- 该进程编成新会话的 会话首进程 (会话首进程是创建该会话的进程) ,此时,该进程是新会话中的唯一进程。
- 该进程成为一个新进程组的组长进程。新进程组ID是该调用进程的进程 ID。
- 该进程没有控制终端。如果在调用 setsid 之前该进程有一个控制终端,那么这种联系也被切断。
- 如果该调用进程已经是一个进程组的组长,则此函数返回出错。
getsid 函数返回 会话首进程的进程组ID (可理解为会话ID):
#include <unistd.h>
pid_t getsid(pid_t pid); //返回值:若成功,返回会话首进程的进程组ID;若出错,返回-1
若 \(pid=0\) ,getsid 返回 调用进程 的会话首进程的进程组ID 。
getsid 函数有如下限制:若 \(pid\) 并不属于调用者所在的会话,那么调用进程就不能得到该会话首进程的进程组ID 。
3. 控制终端

- 一个会话可以有一个 控制终端 。这通常是终端设备(在终端登录情况下)或伪终端设备(在网络登录情况下)。
- 建立与控制终端连接的会话首进程被称为 控制进程 。
- 一个会话中的几个进程可被分成一个 前台进程组 以及一个或多个 后台进程组 。
- 如果一个会话有一个控制终端,则它有一个前台进程组,其他进程组为后台进程组。
- 无论何时键入终端的 中断键 ,都会将 中断信号 发送至前台进程组的所有进程 。
- 无论何时键入终端的 退出键 ,都会将退出信号发送至前台进程组的所有进程。
- 如果终端接口检测到调制解调器(或网络)已经断开连接,则将挂断信号发送至 控制进程(会话首进程)
4. 函数 tcgetpgrp、tcsetpgrp 和 tcgetsid
#include <unistd.h>
pid_t tcgetpgrp(int fd); //返回值:若成功,返回前台进程组ID;若出错,返回-1
int tcsetpgrp(int fd, pid_t pgrpid); //返回值:若成功,返回0;若出错,返回-1
#inlcude <termios.h>
pid_t tcgetsid(int fd); //返回值:若成功,返回会话首进程的进程组ID;若出错,返回-1
\(fd\) 为 控制终端的文件描述符 。
tcsetpgrp 函数将前台进程组ID设置为 \(pgrpid\) 。\(pgrpid\) 值应当是在同一会话中的一个进程组的 ID。
5. 作业控制
一个 作业 即一个进程组。UNIX 允许在一个终端上启动多个作业(进程组),它控制哪一个作业可以访问该终端以及哪些作业在后台运行。
& 放在命令后面表示设置此进程为后台进程。当启动一个后台作业时,shell 赋予它一个作业标识符,并打印一个或多个进程 ID。
有 \(3\) 个 特殊字符 可使终端驱动程序产生信号,并将它发送至前台进程组:
- 中断字符(一般采用 Delete 或 Ctrl+C )产生
SIGINT - 退出字符(一般采用 Ctrl+\ )产生
SIGQUIT - 挂起字符(一般采用 Ctrl+Z )产生
SIGTSTP
fg 命令可将后台作业转为前台作业,如:fg %1 。
6. shell 执行程序
对于使用了 管道 的命令,该管道中的 最后一个进程是 shell 的子进程 ,而执行管道中 其他命令的进程则是该最后进程的子进程 。
如:ps -o pid,ppid | cat1 | cat2 ,cat2 是 shell 的子进程,cat1 和 ps 是 cat2 的子进程。

7. 孤儿进程组
定义 为:该组中每个成员的父进程要么 是该组的一个成员 ,要么 不是该组所属会话的成员 。
一个进程组不是孤儿进程组的条件是:该组中有一个进程,其父进程在属于 同一会话 的 另一个组 中。如果进程组不是孤儿进程组,那么在属于同一会话的另一个组中的父进程就有机会重新启动该组中停止的进程。
《UNIX环境高级编程》(APUE) 笔记第九章 - 进程关系的更多相关文章
- 《UNIX环境高级编程》第七章进程环境
7.2 main函数 1.C程序总是从main函数开始执行的,原型:int main(int argc,char *argv[]);argc是命令行参数的个数argc是指向参数的各个指针所构成的数组2 ...
- (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (八) 一起学 Unix 环境高级编程 (APUE) 之 信号
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级 ...
- (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- (九) 一起学 Unix 环境高级编程 (APUE) 之 线程
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- Java实现 蓝桥杯 算法提高 高精度减法(JDK方法)
试题 算法提高 高精度减法 问题描述 高精度减法 输入格式 两行,表示两个非负整数a.b,且有a > b. 输出格式 一行,表示a与b的差 样例输入 1234567890987654321 99 ...
- (Java实现) 洛谷 P1071 潜伏者
题目描述 R国和 S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S国的 R 国间谍小 C终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原信息经过 ...
- Java实现 LeetCode 459 重复的子字符串
459. 重复的子字符串 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" ...
- Java实现蓝桥杯VIP 算法训练 阶乘末尾
试题 算法训练 阶乘末尾 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定n和len,输出n!末尾len位. 输入格式 一行两个正整数n和len. 输出格式 一行一个字符串,表示 ...
- Java实现 LeetCode 212 单词搜索 II(二)
212. 单词搜索 II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中&quo ...
- Java实现硬币收集问题
1 问题描述 在n*m格木板中放有一些硬币,每格的硬币数目最多为一个,在木板左上方的一个机器人需要收集尽可能多的硬币并把它们带到右下方的单元格.每一步,机器人可以从当前的位置向右移动一格或向下移动一格 ...
- Java实现 蓝桥杯 历届试题 带分数
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- java实现第六届蓝桥杯奇怪的数列
奇怪的数列 从X星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 - YY博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都是对上一行& ...
- java实现第八届蓝桥杯平方十位数
平方十位数 题目描述 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平方). 比如:1026753849,就是其中最小的一个平方数. 请你找出其中 ...
- nginx功能介绍和基本安装
一.简介 nginx是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外ngi ...