我曾经认为一个shell只有支持作业控制,才可以有“前台”和“后台”进程(组)的概念。但我读到的一段话表明这不是真的。
从APUE第 10.3 条:
这种信号状态行为的一个具体示例是交互式 shell 如何处理后台进程的中断和退出信号。使用不支持作业控制的 shell, 当我们在后台执行一个进程时,如
cc main.c &
shell 自动将后台进程中的中断和退出信号的处理设置为忽略。这样做是为了如果我们输入中断字符,它不会影响后台进程。如果不这样做并且我们输入了中断字符,它不仅会终止前台进程,还会终止所有后台进程。
顺便说一句,考虑到上面的例子,
如果不这样做并且我们输入了中断字符,它不仅会终止前台进程,还会终止所有后台进程。
这似乎还表明前台进程和后台进程可以同时连接同一终端。这是真的吗?因为我一直认为终端只能附加到前台进程(组)。
答案1
FWIW 的“后台进程”[1]、“控制终端”[2] 和 shell 中的操作员等概念&
早于作业控制的概念,而作业控制仅出现在 4.1BSD 中。
在实现作业控制并标准化之后,没有作业控制的 shell 中的后台进程的行为可以被分析为某种“精简版作业控制”,其中忽略 和SIGINT
,以及从管道中SIGQUIT
重定向标准输入以某种模仿开始后台作业的行为(但不完全存在;-))。/dev/null
&
这似乎还表明前台进程和后台进程可以同时连接同一终端。这是真的吗?因为我一直认为终端只能附加到前台进程(组)。
在没有作业控制的 shell 中,所有进程(无论是同步(“前台”)还是异步(“后台”)实际上都运行在同一个进程组(作业)中,这与 shell 进程的情况相同,并且可以终端上的后台或前台作业。
因为所有这些进程都会收到例如。当SIGINT
shell 本身位于前台进程组并^C
在终端上键入时,它们的“后台模式”是通过忽略信号来模拟的SIGINT
。魔术休息当命令&
从 shell 脚本开始时,安装它们自己的SIGINT
处理程序。
请注意,通常会运行 shell 脚本没有作业控制,除非set -m
使用该选项。
[1] 参见《Unix for Beginners》中的“The Shell”一章书,部分Unix v6 发行版 (1975)。
[2]《控制打字机》中杀死(2)同一 Unix v6 的联机帮助页。