当 shell 运行内置函数并且键盘生成信号时,什么将处理该信号?

当 shell 运行内置函数并且键盘生成信号时,什么将处理该信号?

如果我错了,请纠正我:当 bash shell 运行外部可执行程序时,bash shell 将创建一个子进程在前台运行该程序。如果有任何按键生成的信号,该信号将是发送到子进程和处理过通过程序。

当 bash shell 运行内置命令时,bash shell将直接在前台运行shell进程中的内置命令。如果有任何按键产生的信号,该信号是否会被发送到shell进程?这将处理信号、内置命令的程序或bash?内置命令可以有自己的信号处理程序,还是必须依赖于 的信号处理程序bash

例如,当 bash shellwait在前台运行并且我按 Ctrl-C 时,信号 SIGINT 会被 shell 进程接收并由waitbash 处理吗?是否wait有自己的信号处理程序或依赖于 的信号处理程序bash

谢谢。

答案1

内置命令程序或 bash 哪个将处理信号?

内置命令的程序是bash。这就是内置程序的定义:它内置于 shell 中,而不是外部程序。

shell 可能会做出不同的反应,具体取决于它收到信号时正在执行的操作。但接收信号的始终是 shell 进程,因为不涉及其他进程。

答案2

理解 Linux 终端设备 ( /dev/tty*, /dev/pts/*) 的最简单方法是将它们视为流式套接字。就好像这将/dev/tty12是一个 TCP 端口,例如127.0.0.1:8080.

进程连接到它们,从它们获取输入,写入它们,然后最终与它们断开连接。一个套接字(终端)可以与多个进程建立连接。

其他进程可以听他们说话,它们通常是终端仿真器程序,但并非总是如此。对于字符终端,Linux 内核本身充当终端设备上的“监听器守护进程”。

终端具有但套接字没有的“额外功能”:内核跟踪哪些进程连接到它,并且能够根据需要向它们发出信号。例如,如果您按Ctrl+ c,就会发生这种情况。

您可以阅读所传递信号的详细列表那里回答。

如果按Ctrl+到底会发生什么c

这是不是就好像有人按下了一个普通按钮,例如一个a按键。在这种情况下,按下的键只是简单地写入终端设备,并且可以由从中读取的进程(通常是前台进程)读出。

在特殊按键的情况下,例如Ctrl+ z,或者当您关闭/调整终端窗口大小等时,终端会收到请求,并且内核会向附加到它的所有进程发送相应的信号。致他们所有人,稍后会很重要。

这些设备也可以通过定向ioctl()调用来控制。

如果 bash 运行子进程(即外部命令),则会发生以下情况:

  1. bash 在后台启动该进程,并为其提供终端
  2. bash 停止从终端获取输入
  3. 进程停止后,bash 将恢复所有内容。

但是,bash 仍然连接到终端设备,如果出现Ctrl+ c,它将收到信号。外部命令也会收到信号。

然而,这些信号可以被覆盖(signal()系统sigaction()调用)。 Bash 会覆盖它们,即它用自己的信号处理例程覆盖默认的信号处理例程(这将简单地停止它)。这就是为什么如果您在命令提示符中按Ctrl+则它不会退出。c

然而,asleep 60将会退出。它不会更改其信号处理程序。

如果您运行 bash 内部命令,该信号处理程序将按照您所说的方式工作(它会停止内部命令执行并让您返回提示符)。

相关内容