当 bash 收到 SIGINT 信号时会做什么?

当 bash 收到 SIGINT 信号时会做什么?

该页面内容如下:

当 Bash 是交互式的时,在没有任何陷阱的情况下,它会忽略 SIGTERM(因此“kill 0”不会杀死交互式 shell),并且 SIGINT 会被捕获并处理(以便 wait 内置命令是可中断的)。当 Bash 收到 SIGINT 时,它会中断任何正在执行的循环。

通常当程序收到SIGINT信号时,程序就会退出。但bash收到信号时并不退出SIGINT,而是“它打破了任何执行循环”。这意味着什么?

答案1

bash这意味着此时正在运行的内置函数和循环将被中止。要实现 SIGINT 效果bash,请使用Ctrl+D

答案2

最终,bash 被破坏了。 shell 进程处理 sigint 的方式是捕获它,然后停止所有处理并等待所有挂起的前台进程退出。实际上,SIGINT 没有理由不中断前台运行的所有内容。这就是很久以前创建进程组的原因。用户给出的 bash 的每个“命令”都应该在同一个 pgroup 中分叉进程,并且信号应该转发到该 pgroup。如果正确使用 pgroup,则不需要转发信号,因为分叉的每个进程都应具有与 bash 默认情况下相同的信号处理。 nohup 应该导致所有分叉进程忽略ighup ==。

bash 中遗漏了许多有关原始 unix shell 信号处理和进程关系的细节。特别是对 shellscript 的 SIGINT 应该完全停止整个 shellscript,而不是从循环中中断,这只会导致它开始更多的处理,这可能会破坏文件,因为之前的工作由于 SIGINT 而没有完成。

是的,trap语句可以帮助你更干净地退出。但在原始的 unix shell 实现中从来不需要它。它主要是临时文件使用或其他类似细节的清理机制。现在,需要让 shell 在应该退出的时候退出,这使得编写可靠且容易被中断的 shell 脚本变得困难。

相关内容