APUE读书笔记-第9章 进程关系

第9章 进程关系
9.1 引言
*每个进程都有一个父进程(初始的内核进程并无父进程,也可以说其父进程就是它自己)
*当子进程终止时,父进程得到通知并能取得子进程的退出状态


9.2 终端登录
*终端可以是基于字符的终端、仿真简单的基于字符终端的图形终端,或者是运行窗口系统的图形终端
*系统管理员创建通常名为/etc/ttys的文件,其中,每个终端设备都有一行,每一行说明设备名和传递给getty程序的参数。当系统自举时,内核创建进程ID为1的进程,也就是init进程。init进程使系统进入多用户状态。init进程读文件/etc/ttys,对每一个允许登陆的终端设备,init调用一次fork,它所生成的子进程则执行(exec)getty程序


9.3 网络登录
*通过串行终端登录至系统和经由网络登录至系统两者之间的主要(物理上)区别是:通过网络登录时,终端盒计算机之间的链接不是点对点连接。在这种情况下,login只是一种可用的服务,这与其他网络服务(例如FTP或SMTP)的性质相同


9.4 进程组
*每个进程除了有一个进程ID之外,还属于一个进程组


9.5 会话
*会话(session)是一个或多个进程组的集合。通常是由shell的管道线将几个进程编程一组的


9.6 控制终端
*有时不管标准输入、标准输出是否被重定向,程序都要与控制终端交互。保证程序能读写控制终端的方法是打开文件/dev/tty,在内核中,此特殊文件时控制终端的同义语。自然,如果程序没有控制终端,则打开此设备将失败


9.7 tcgetpgrp,rcsetpgrp,tcgetsid函数
*函数tcgetpgrp返回前台进程组的进程组ID
*如果进程有一个控制终端,则该进程可以调用tcsetpgrp将前台进程组ID设置为pgrpid
*给出控制TTY的文件描述符,调用tcgetsid的应用程序就能获得会话首进程的进程组ID


9.8 作业控制
*作业控制允许在一个终端上启动多个作业(进程组),它支持哪一个作业可以访问该终端,以及哪些作业在后台运行。作业控制要求下面三种形式的支持:
(1)支持作业控制的shell
(2)内核中的终端驱动程序必须支持作业控制
(3)内核必须提供对某些作业控制信号的支持


9.9 shell执行程序
*Linux的shell在前台在一个管道线中执行两个进程,两个进程都在一个新的进程组中,这是一个前台进程组。shell是两个进程的父进程


9.10 孤儿进程组
*孤儿进程组(orphaned process group)定义为:该组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员
*孤儿进程组另一种描述为:一个进程组不是孤儿进程组的条件是,该组中有一个进程,其父进程在属于同一会话的另一个组中


9.11 FreeBSD实现
*session结构:每个会话都分配一个session结构
*tty结构:每个终端设备和每个伪终端设备均在内核中分配这样一种结构
*pgrp结构:包含一特定进程组的信息
*proc结构:包含一个进程的所有信息
*vnode结构:在打开控制终端设备时分配此结构,进程对/dev/tty所有引用都通过vnode结构。实际i节点是v节点的一部分

你可能感兴趣的:(APUE读书笔记-第9章 进程关系)