2012-01-05 89 views
0

我想了解一些用于描述bash中的信号处理的示例代码。在示例32-7的http://tldp.org/LDP/abs/html/debugging.html中,作者的评论指出他正在捕获SIGINT,但陷阱是针对EXIT的。在后台进程中捕获SIGINT

 
{ 
    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的陷阱发送正确的信号(SIGUSR1)与化背景过程上的SIGINT(CTL-C)?

任何帮助表示赞赏解释为什么这个工程。

回答

0

EXIT伪信号成为上都正常退出而当脚本被中断误读了这个问题。

+1

不,只有当进程调用exit(2)本身(或者因为它到达脚本的结尾或者明确的“退出”指令)。 – fge 2012-01-05 08:56:56

+0

对,脚本应该有像'陷阱'出口127'2 15'来处理这个问题。 – tripleee 2012-01-05 12:06:04

+0

啊。得到它了。经过进一步测试后,我看到在键盘中断时,执行了INT陷阱,然后发生了EXIT陷阱。 – user1131035 2012-01-09 19:24:17

1

EXIT是bash的trap的特殊处理程序,它不是一个信号。没有退出信号。只要bash进程终止,该陷阱就会被执行。所以,确保如果用户杀死bash进程,SIGUSR1会被发送到后台进程,后台进程也会被捕获,然后在该进程中执行“退出”。这确保了如果你终止会话,后台进程不会永远生活,但也会退出(这可能是评论试图解释的内容)。

编辑:我在原来的响应

+0

你也误解了代码。伪信号“EXIT”的陷阱显然是在最后一行设置的。这会在Bash中创建一个退出处理程序。但代码serms不完整。 – tripleee 2012-01-05 07:36:04

+0

......事实上,脚本会继续执行一些长时间运行的命令(请参阅问题链接)。 – tripleee 2012-01-05 07:40:54

+0

@tripleee你是对的!我甚至没有处理最后一行代码!我将编辑我的回复(上面的代码已完成) – 2012-01-05 07:41:06