CSDN 上的 APUE 读书笔记第九章 -- 进程关系

20 篇文章 0 订阅

第九章 进程关系


1、进程组(process group)

进程组是一个或多个进程的集合,通常用于作业控制;

组长是创建进程组的进程。进程组 ID(PGID)等于组长的 PID。

设置和获取 PGID:

#include <unistd.h>
pid_t getpgid(pid_t pid);
int setpgid(pid_t pid, pid_t pgid);
setpgid(2)只能用于进程自身或其尚未执行 exec(3)的子进程:当 pid==pgid 时,使 PID 为 pid 的进程成为所在进程组的组长;pid==0时,使调用此函数的进程成为组长;pgid==0时,使进程的PID 成为PGID。


2、会话(session)

会话是一个或多个进程组的集合,建立新会话的函数是:

#include <unistd.h>
pid_t setsid(void);

调用成功时,调用进程成为一个新进程组的组长,并返回其 PGID(即进程自己的 PID);

进程组组长不能新建会话,执行 setsid(2)时将返回-1;

如果进程拥有控制终端,执行setsid(2)后将被断开;

#include <unistd.h>
pid_t getsid(pid_t pid);

该函数根据指定的进程返回其SID,要求指定的进程属于调用者所在的会话。从取值上看,SID 等价于会话首进程的 PID 同时也等价于首进程的 PGID;


3、控制终端(controlling terminal)

一个会话可以有一个控制终端。根据控制终端引入了控制进程(与控制终端建立了连接的进程,即会话首进程)、前台进程组(拥有控制终端的进程组,一个会话最多只有一个)、后台进程组(一个会话中无控制终端的其它进程组)等概念;

进程通过打开/dev/tty来建立与控制终端的连接:

#include <unistd.h>
pid_t tcgetpgrp(int filedes);
int tcsetpgrp(int filedes, pid_t pgrpid);

tcgetpgrp(3)返回拥有控制终端的控制进程的 PID(即前台进程组的 PGID),tcgetpgrp 设置所打开终端的前台进程组,用于获得 tty。其中,参数 filedes 为所打开的 tty 的文件描述符;


4、作业控制(job control)

一个作业通常即是一个进程组,几个进程之间通过管道线连接以完成所需任务。

在 shell 中,直接输入命令则启动一个前台作业,如果该命令行以&结尾则启动为后台作业。如:以管道线创建一个前台作业:

$ tail -f /var/log/apache2/access.log | grep GET | grep http.*admin.*.php

创建一个后台作业:

$ find / -mount -type f -perm -4000 -ls | awk {'print $3, $5, $6, $NF'} > /mnt/usb/setuidfiles &
若要将前台作业转为后台进行,键入Ctrl + Z,此时作业处于暂停状态。

查看当前的后台作业状态使用jobs(1)命令。

使后台暂停的作业继续执行使用 bg(1)命令,使后台作业在前台执行使用 fg(1)命令。

只有前台作业可以接受终端的输入。后台作业需要接受输入时,通过捕捉信号SIGTTIN 信号而挂起,此时 shell 将在标准输出上报告其作业状态(stopped);但后台作业可以对终端输出,通过stty(1)命令可改变其设置,使其在需要执行输出时暂停(信号 SIGTTOU),并在 shell 上报告作业状态。

也可以通过重定向stdout 和stderr使后台作业不向终端执行输出,如:

$ make > /dev/null 2>&1 & 

6、孤儿进程组(orphaned process groups)

定义为:该组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。

或者:一个进程组不是孤儿进程组的条件是:该组中存在一个进程,其父进程在同一会话的其它进程组中。

孤儿进程组将被置于后台执行。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值