Unix环境高级编程学习笔记 第9章 进程关系

来源:互联网 发布:海南广电网络 编辑:程序博客网 时间:2024/06/04 18:46

  这章的主要概念:

   1.进程组

   2.会话

   3.控制终端

   4.孤儿进程组 

   前三者之间的关系: 一次登录终端即形成一个会话,一个会话可以有多个进程组,一个会话可以有一个控制终端,只有一个前台进程组(拥有控制终端的进程组)可以有多个后台进程组。

   要注意的:如果后台作业要读终端,则终端驱动程序会产生SIGTTIN信号并停止该后台作业.在用户禁止后台作业写到控制终端时,如果后台进程试图写到终端,则驱动程序会向该作业发送SIGTTOU信号,停止后台作业. 要注意这两个信号产生的条件及特点,在后面实现守护进程时需用到。

    对书上图9-8的解释:

     由shell进程fork出的子进程本来具有和shell相同的session,进程组和控制终端.但是shell调用setpgid函数将作业中的某个子进程指定为一个新进程的leader,然后调用setpgid将作业中的其它子进程也转移到这个进程组中,如果这个进程组需要在前台运行,就调用tcsetpgrp函数将它设置为前台进程组,由于一个session只能有一个前台进程组,所以shell所在的进程组就自动变成后台进程组. 

     这个可以通过9.9节中的例子验证.

    程序9-1的解释:  父子进程都属于同一个进程组并且是前台进程组,此时shell是后台作业.当子进程sleep后,父进程终止.即该进程组的组长进程终止,shell并不知道该进程组还有一个进程(此进程并不是shell的子进程).认为其作业结束,shell把自己提至前台,此时该子进程的进程组成为后台进程组.当该子进程试图读终端时,则驱动程序会产生SIGTTIN信号.

    一个进程组不是孤儿进程组的条件是:该组中有一个进程,其父进程在属于同一会话的另一个组中.这有点不好理解,可以结合9-1的例子去理解.9-1中的进程组中只有一个子进程了,其父进程是init,init并不在该子进程的同一个会话中.所以该进程组为孤儿进程组.


原创粉丝点击