Ch 9 进程关系

终端登录

读取 /etc/ttys,每一个终端 fork 一个并执行 getty ,用于读取登录用户名和初始环境集,输入完成后再执行 exec login 接着读取密码,通过了再执行 shell 完成用户的终端登录

网络连接使用伪终端驱动,通过 telnetd 后台服务和 telnet 客户端来进行通信,仿佛就像是硬连接

进程组

每个进程组有一个组长进程,组长进程的进程组ID等于其进程ID,只要某进程组有一个进程存在,进程组就存在

一个进程只能为它自己或它的子进程设置进程组ID。在它的子进程调用 exec 后,就不能再更改该子进程的进程组ID

fork 之后 父子都调用 setpgid 可以保证无论运行的先后顺序如何,进程组ID都能够被正确地设置

会话

会话是一个或多个进程组的集合 使用管道符 | 命令的几个进程都会被遍成一组

会话是终端前台和后台实现的基础,一个会话中的几个进程组可被分成一个前台进程组,以及一个或多个后台进程组

作业控制

作业控制通过作业控制信号来支持

三种特殊字符可使终端驱动程序产生信号,并将它们发送至前台进程组

中断字符 - SIGINT 退出字符 - SIGQUIT 挂起字符 - SIGTSTP

只有前台作业接收终端输入。如果后台作业试图读终端,这并不是一个错误,终端驱动程序会检测到这种情况,并向后台作业发送 SIGTTIN ,此信号通常会停止后台作业,shell 会向用户发送通知。转为前台进程组会发送继续信号 SIGCONT 送给该进程组

shell

shell 先 fork 一个自身的副本,然后再为管道中的每一条命令各 fork 一个进程,这几条命令的进程和 shell 都归属于一个前台进程组