不支持作业控制的 shell 是否有前台和后台进程的概念?

不支持作业控制的 shell 是否有前台和后台进程的概念?

我曾经认为一个shell只有支持作业控制,才可以有“前台”和“后台”进程(组)的概念。但我读到的一段话表明这不是真的。

APUE第 10.3 条:

这种信号状态行为的一个具体示例是交互式 shell 如何处理后台进程的中断和退出信号。使用不支持作业控制的 shell, 当我们在后台执行一个进程时,如

cc main.c &

shell 自动将后台进程中的中断和退出信号的处理设置为忽略。这样做是为了如果我们输入中断字符,它不会影响后台进程。如果不这样做并且我们输入了中断字符,它不仅会终止前台进程,还会终止所有后台进程。


顺便说一句,考虑到上面的例子,

如果不这样做并且我们输入了中断字符,它不仅会终止前台进程,还会终止所有后台进程。

这似乎还表明前台进程和后台进程可以同时连接同一终端。这是真的吗?因为我一直认为终端只能附加到前台进程(组)。

答案1

FWIW 的“后台进程”[1]、“控制终端”[2] 和 shell 中的操作员等概念&早于作业控制的概念,而作业控制仅出现在 4.1BSD 中。

在实现作业控制并标准化之后,没有作业控制的 shell 中的后台进程的行为可以被分析为某种“精简版作业控制”,其中忽略 和SIGINT,以及从管道中SIGQUIT重定向标准输入以某种模仿开始后台作业的行为(但不完全存在;-))。/dev/null&

这似乎还表明前台进程和后台进程可以同时连接同一终端。这是真的吗?因为我一直认为终端只能附加到前台进程(组)。

在没有作业控制的 shell 中,所有进程(无论是同步(“前台”)还是异步(“后台”)实际上都运行在同一个进程组(作业)中,这与 shell 进程的情况相同,并且可以终端上的后台或前台作业。

因为所有这些进程都会收到例如。当SIGINTshell 本身位于前台进程组并^C在终端上键入时,它们的“后台模式”是通过忽略信号来模拟的SIGINT。魔术休息当命令&从 shell 脚本开始时,安装它们自己的SIGINT处理程序。

请注意,通常会运行 shell 脚本没有作业控制,除非set -m使用该选项。

[1] 参见《Unix for Beginners》中的“The Shell”一章,部分Unix v6 发行版 (1975)。

[2]《控制打字机》中杀死(2)同一 Unix v6 的联机帮助页。

相关内容