我一直在调试一个Python程序,该程序在收到KeyboardInterrupt异常后会出现segfaults。这通常是通过在shell中按Ctrl+C来完成的。为了测试某个特定的代码更改是否修复了这个bug,我有一个小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 %

关于unix - Ctrl-C和SIGINT有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56966159/

10-11 18:49