APUE编程:112---进程管理(进程、进程组、会话、控制终端的结构图:session、tty、pgrp、proc)_tty APUE编程:112---进程管理(进程、进程组、会话、控制终端的结构图:session、tty、pgrp、proc)_proc_02 一、session结构

下面说明图中的各个字段。从session结构开始。每个会话都分配了这样一种结构(例如, 每次调用setsid时):

  • s_count是该会话中的进程组数。当此计数器减至0时,则可释放此结构
  • s_leader是指向会话首进程proc结构的指针
  • s_ttyvp是指向控制终端vnode结构的指针
  • s_ttyp是指向控制终端tty结构的指针
  • s_sid是指会话ID(但是会话ID不是Single UNIX Specification的组成部分)

在调用setsid时,在内核中分配一个新的session结构。s_count设置为1,s_leader设置为调用进程的proc结构的指针,s_sid设置为进程ID。因为新会话没有控制终端,所以s_ttyvp和s_ttyp设置为空指针

二、tty结构

每个终端设备和每个伪终端设备均在内核中分配这样一种结构

  • t_session指向将此终端作为控制终端的session结构(注意,tty结构指向session结构,session结构也指向tty结构)。终端在失去载波信号时使用此指针将挂起信号送给会话首进程
  • t_pgrp指向前台进程组的pgrp结构。终端驱动程序用此字段将信号送向前台进程组。由输入特殊字符(中断、退出和挂起)而产生的3个信号被送至前台进程组
  • t_termios是包含所有这些特殊字符和与该终端有关信息(例如波特率、回显打开或关闭等)的结构
  • t_winsize是包含终端窗口当前尺寸的winsize结构。当终端窗口尺寸改变时,信号SIGWINCH被送至前台进程组

注意,为了找到特定会话的前台进程组,内核从session结构开始,然后用s_ttyp得到控制终端的tty结构,然后用t_pgrp得到前台进程组的pgrp结构

三、pgrp结构

pgrp结构包含一个特定进程组的信息:

• pg_id是进程组ID。

• pg_session指向此进程组所属会话的session结构

• pg_mem是指向此进程组第一个进程proc结构表的指针。该proc结构代表进程组的成员。proc结构中的p_pglist结构是双向链表,指向该组中的下一个进程和上一个进程。直到遇到进程组中的最后一个进程,它的proc结构中的p_pglist结构为空指针

四、proc结构

proc结构包含一个进程的所有信息

• p_pid包含进程ID

• p_pptr是指向父进程proc结构的指针

• p_pgrp指向本进程所属的进程组的pgrp结构的指针

• p_pglist是一个结构,其中包含两个指针,分别指向进程组上一个和下一个进程

最后还有一个vnode结构。如前所述,在打开控制终端设备时分配此结构。进程对/dev/tty的所有访问都通过v n o d e结构