下面说明图中的各个字段。从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结构