我一直在调试一个Python程序,它在收到KeyboardInterrupt
异常后发生段错误。这通常通过从shell中按下Ctrl + C来完成。为了测试一个特定的代码修改是否修复了这个bug,我有一个小的shell脚本,它在启动后随机发送SIGINT
到程序中。我遇到的问题是,发送Ctrl + C似乎对程序的影响不同于发送信号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
我不确定这会有多大的差异,但它可能ctrl + c发送'SIGTERM'而不是'SIGINT'。另外,处理异常时,你是否正确清理子流程/线程? python处理线程的方式我不相信它会出现seg-fault,但是它可能有子进程。 – David
代码中是否有多线程? – Casey