FreeBSD实现

FreeBSD实现

已经说了多种进程、进程组、会话和控制终端的属性。现在是看一下这些是如何实现的。我们简单浏览一下FreeBSD是如何实现的。

figure9-12

让我们看一下标记的字段,从session结构开始。每个会话会被分配一个该结构(也就是setsid被调用时)。

  • s_count是会话中进程组号。当这个统计器减到零时,这个结构可以被释放。
  • s_leader是一个指向会话长(session 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_ttyvps_ttyp被设置成空指针(因为新的会话没有控制终端)

现在让我们看一下tty结构。内核会为每个终端设备和每个pseudo终端设备分配一个该结构。

  • t_session指向session结构,被指向的这个结构以该终端做为自己的控制终端。(注意:tty结构指向session结构,反之亦然)如果终端失去焦点(if the terminal loses carrier)这个指针被终端用来给会话长发送hang-up信号。
  • t_pgrp指向前台进程组的pgrp结构。这个字段被终端驱动发送信号到前台进程组。有三种特殊字符被发送到前台进程组中(interrupt, quit, suspend)
  • t_termios该结构包含所有该终端的特殊字符和相关信息,如:波特率,是否开启反馈(is echo on or off),等等。
  • t_winsize是一个winsize结构,它包含了当前终端窗口大小。当终端窗口大小改变时SIGWINCH信号被发送到前台进程组。

注意找一个特定会话的前台进程组,内核必须以session结构开始,之后s_ttyp获得控制终端的tty结构,在这之后t_pgrp获得前台进程组的pgrp结构。pgrp结构包含了特定进程组的信息。

  • pg_id是进程组ID。
  • pg_session为当前进程组的会话指向session结构。
  • pg_members是一个指向proc结构列表的指针,该表中的表成员都是属于这个进程组。在proc结构中的p_pglist结构是一个双向链表,它在进程组中同时指向前、后两个进程,直到进程组中最后一个进程之后遇到了一个空指针。

proc结构包含了所有单个进程的信息。

  • p_pid包含了进程ID
  • p_pptr是一个指向父进程的proc结构的指针。
  • p_pgrp指向进程所属的进程组的pgrp结构。
  • p_pglist是一个结构,包含了指向该进程组中前、后两个进程的指针

最后,还有vnode结构。当控制终端设备被打开时,这个结构被分配。进程中所有指向/dev/tty设备都要使用vnode结构。

Comments are closed.