在后台进程中捕获SIGINT

时间:2012-01-05 07:17:25

标签: bash signals background-process

我试图理解一些描述bash中信号处理的示例代码。在示例32-7中http://tldp.org/LDP/abs/html/debugging.html,作者的注释表明他正在捕获一个SIGINT,但该陷阱是用于EXIT。

{
     trap "exit" SIGUSR1
     sleep $interval; sleep $interval
     while true; do
         ...
     done; } &         # Start a progress bar as a background process.

pid=$!
trap "echo !; kill -USR1 $pid; wait $pid"  EXIT        # To handle ^C.

为什么EXIT的陷阱会在SIGINT(Ctl-C)上向backgroud进程发送正确的信号(SIGUSR1)?

感谢任何帮助解释为什么这样做。

2 个答案:

答案 0 :(得分:1)

EXITtrap中针对bash的特殊处理程序,它不是信号。没有退出信号。只要bash进程终止,就会执行此陷阱。所以,这样做是为了确保如果用户杀死bash进程,SIGUSR1将被发送到后台进程,后者也被捕获,然后在该进程上执行'exit'。这可以确保如果您终止会话,后台进程不会永久存在但也会退出(这可能是评论试图解释的内容)。

编辑:我在原始回复中误解了这个问题

答案 1 :(得分:0)

EXIT伪信号在正常退出和脚本被中断时被引发。