unix - Ctrl-C 和 SIGINT 有什么区别?

标签 unix sigint keyboardinterrupt

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

该程序根本不捕获任何键盘操作,只是一个带有一些线程/进程的 python 程序。它不安装信号处理程序(尽管 Python 安装),并且 stty -a 给出 intr = ^C。我怀疑可能是 Ctrl+CSIGINT 发送到所有子进程/线程,而 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/

相关文章:

linux - 尝试在 shell 中删除文件时发生错误(语法错误 : bad fd number)

go - 优雅地关闭 Gorilla 服务器

python - 已结束的程序(Flask)一直将输出发送到 STDOUT?

Python 异常处理 -- 回行,继续

linux - 关于linux命令的问题

linux - 使用 sed 将模式替换为文件末尾

Java Unix Shell 更改目录

c++ - 我怎样才能捕捉到 ctrl-c 事件?

python - 如何使用 Ctrl+C 杀死子线程?

python - 无法在 Python 中中止 (ctrl+c)