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进程收养。
孤儿进程组定义:改组中每个成员的父进程要么是该组的一个成员,要么不是该组所属会话的成员。
一个进程组不是孤儿进程组的条件是:该组有一个进程,它的父进程在属于同一会话的另一个组中。