【发布时间】:2011-12-06 11:02:56
【问题描述】:
我一直在调试一个 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
【问题讨论】:
-
我不确定这会有多大的不同,但它可能的 ctrl+c 发送
SIGTERM而不是SIGINT。此外,在处理异常时,您是否正确清理了子进程/线程? python 处理线程的方式我不相信它会出现段错误,但它可能与子进程有关。 -
+C 可以配置,所以检查你的 stty -a设置,寻找intr = ^C,也许^C 也被设置为其他东西? -
代码中有多线程吗?
-
刚刚看到您说您的 OP 中有线程。我会说这可能是你的问题。当脚本收到 SIGINT 时,线程没有正确终止。
-
与发送信号 -INT 相比,如果您执行 ctrl + C,是否会影响线程?我说线程的原因是我使用多处理管理器,而python实现它的方式使用线程库。
标签: unix sigint keyboardinterrupt