进程关系之作业控制(孤儿进程组)

1. 作业控制

作业控制是BSD在1980年增加的一个特性。一个作业只是几个进程的集合。作业控制要求以下三种形式的支持:

1). 支持作业控制的shell(C shell支持,Bourne shell不支持,而Korn shell视情况)。

2). 内核中的终端驱动程序必须支持作业控制。

3). 内核必须提供对某些作业控制信号的支持。

三个特殊字符可使终端驱动程序产生信号:

1). 中断字符(DELETE或Ctrl+C)产生SIGINT。

2). 退出字符(Ctrl+/)产生SIGQUIT。

3). 挂起字符(Ctrl+Z)产生SIGTSTP。

只有前台作业才能接受终端输入。如果后台作业试图读控制终端,则会产生信号SIGTTIN。该信号通常会暂时停止此后台作业,而shell则向有关用户发出这种情况的通知,然后用户就可以用shell命令将此作业转为前台作业执行。终端I/O和终端产生的信号总是从前台进程组连接到实际终端,对于SIGTTOU信号,后台进程组进程的输出释放出现在终端是可选的。如下:

#cat temp.txt & 在后台执行

[1] 1986

# hello world                提示符后出现后台作业的输出

                                     键入回车

[1] + Done cat temp.txt &

#stty tostop                 禁止后台作业输出至控制终端

# cat temp.txt &           在后台执行

[1] 1989

# hello world               提示符后出现后台作业的输出

#                                 键入回车, 发现作业已经停止

[1] + Stopped(SIGTTOU)   cat temp.txt &

#fg %1                       在前台恢复停止的作业

cat temp.txt                shell告诉我们现在哪个作业在前台

hello world                  这是该作业的输出

 

2. 孤儿进程组

一个父进程已经终止的进程称为孤儿进程(orphan process),这种进程由init进程收养。

孤儿进程组定义:改组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。

一个进程组不是孤儿进程组的条件是:该组有一个进程,它的父进程在属于同一会话的另一个组中。

 

 

 

你可能感兴趣的:(c,shell,delete,终端,作业)