我一直在调试一个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
SIGTERM
而不是SIGINT
。此外,在处理异常时,您是否正确清理了子进程/线程?Python处理线程的方式我不认为会导致段错误,但使用子进程可能是可能的。 - David