Ctrl-C和SIGINT的区别是什么?



我一直在调试一个Python程序,该程序在收到KeyboardInterrupt异常后出现分段故障。这通常通过在shell中按Ctrl+C来完成。为了测试特定的代码更改是否修复了错误,我编写了一个小的shell脚本,在启动后随机向程序发送SIGINT。我遇到的问题是,发送Ctrl+C似乎对程序有不同的影响,而不是发送信号SIGINT,因此不会导致错误出现,所以我很想知道这两个动作之间的差异是什么。

程序根本不捕获任何键盘动作,只是一个python程序,其中包含一些线程/进程。它不安装信号处理程序(尽管Python安装),stty -a给出intr = ^C。我怀疑这可能是Ctrl+C发送SIGINT到所有子进程/线程,而kill -INT只发送到主进程,但这就是我的怀疑。

下面是发送kill -INT的shell脚本。

wait
while :; do
    seconds="$(python -c 'import random; print random.random()*4')"
    ./mandos --debug --configdir=confdir 
             --statedir=statedir --no-restore --no-dbus &
    pid=$!
    { sleep $seconds; kill -INT $pid; } &
    fg %./mandos
    status=$?
    if [ $status -gt 1 ]; then
        echo "Failed exit $status after $seconds seconds"
        break
    fi
    wait
done

^C向前台进程组中的所有进程发送SIGINT。要对kill执行相同的操作,您应该向进程组发送信号(操作系统级别的概念):

kill -SIGINT -<pid>

或到作业(shell级别的概念,管道以&结束):

kill -SIGINT %

如下所述:

Python默认安装少量信号处理程序:SIGPIPE被忽略(因此管道和套接字上的写入错误可以报告为普通Python异常)和SIGINT被翻译成KeyboardInterrupt例外。所有这些都可以被覆盖。
因此,发送SIGINT和发送Ctrl + c之间的行为应该是相同的。

但是,你必须小心KeyboardInterrupt,如果在你的代码中有一个

try:
   ...
except:   # notice the lack of exception class
   pass

这将"吃掉"KeyboardInterrupt异常。

相关内容

  • 没有找到相关文章

最新更新