如果我将 bash 作为调用的第一个进程(即作为 init),结果它将显示以下内容:
init: cannot set terminal process group (-1): Inappropriate ioctl for device
init: no job control in this shell
并且没有信号(例如^C,^Z)起作用。
通过阅读bash-5.1.12的源码,问题出在job.c
4501行的表达式:
(t = tcgetpgrp (shell_tty)) == -1
错误值为ENOTTY
,表示调用进程没有控制终端。
为什么 Bash 在作为 init 调用时没有控制终端?
的控制终端由
bash
准备(打开)login
。因此,如果bash
直接调用为 init skipinglogin
,它会在上面抛出这个问题,因为控制终端在处理信号方面起着特殊的作用。根据源码login.c(in ), in
util-linux
的调用过程大致如下:bash
login
main() 调用 fork_session()
分叉一个新进程。(在
fork_session()
功能中)使新流程成为会话负责人。 为了获得控制终端,该进程必须先成为会话领导者。(在
fork_session()
功能中)获取会话负责人的控制 tty。会话领导者通过
open
tty 获取控制终端。(在fork_session()
功能中)在新进程中执行登录 shell。(返回
main()
)更多关于控制终端概念的链接: