一、作业的概念

  • 一个进程组就是一个作业,是一些进程的集合,通常是一个进程管道

二、作业控制的3种形式

  • 支持作业控制的shell
  • 内核中的终端驱动程序必须支持作业控制
  • 必须提供对某些作业控制信号的支持

三、不同系统对作业的支持情况

UNIX(编程-进程基础):20---作业控制(SIGTTIN、SIGTTOU信号)

四、作业标识符

五、信号处理

可以键入下面的信号发送给作业

  • 中断字符(一般采用DELETE或Ctrl-C)产生SIGINT信号
  • 退出字符(一般采用Ctrl-\)产生SIGQUIT信号
  • 挂起字符(一般采用Ctrl-Z)产生SIGTSTP信号

注意事项:

  • 因为终端驱动程序有一个前台作业和若干个后台作业。当我们在终端输入上面那个信号处理字符时,只有前台作业才会接受

六、SIGTTIN信号

  • 因为只有前台进程才可以接受终端的输入,如果后台作业试图读终端,终端驱动程序检测这种情况,并且发送一个特定信号SIGTTIN给后台作业,该信号会停止此后台作业,而shell则向有关用户发出这种情况的通知

演示案例

  • 第一步:从标准输入读取数据,然后重定向到temp.foo文件中。但是我们选择将此任务丢到后台运行(变为后台作业)

当我们再次按下回车之后,可以看到后台任务变为Stopped状态,并且将信息通知到控制台中

UNIX(编程-进程基础):20---作业控制(SIGTTIN、SIGTTOU信号)

  • 第二步:我们使用fg命令将任务拿到前台运行,并且输入内容。查看temp.foo文件的内容

UNIX(编程-进程基础):20---作业控制(SIGTTIN、SIGTTOU信号)

七、SIGTTOU信号

  • 后台作业如果有标准输出,那么默认标准输出会显示到前台的终端上。我们也可以通过流重定向到别处
  • 如果我们不希望后台进程有标准输出,则可以使用stty命令禁止后台作业向终端输出。如果有后台作业向终端输出,就会向该作业发送SIGTTOU信号,此时此作业就会处于阻塞状态(Stopped)

演示案例

  • ①我们没有使用stty命令,则后台任务有标准输出就会打印到终端上

UNIX(编程-进程基础):20---作业控制(SIGTTIN、SIGTTOU信号)

  • ②使用stty命令,禁止后台作业输出到控制终端。之后再cat文件,发现任务已经被Stopped了

UNIX(编程-进程基础):20---作业控制(SIGTTIN、SIGTTOU信号)

八、作业控制总结

UNIX(编程-进程基础):20---作业控制(SIGTTIN、SIGTTOU信号) 

UNIX(编程-进程基础):20---作业控制(SIGTTIN、SIGTTOU信号)

相关文章: