我一直在调试收到KeyboardInterrupt
异常后发生段错误的Python程序。 这通常是通过从shell中按下Ctrl + C来完成的。 为了测试一个特定的代码修改是否解决了这个错误,我有一个小的shell脚本,它在启动后的任意时间发送SIGINT
到程序。 我遇到的问题是,发送Ctrl + C似乎对程序有不同的影响,而不是发送SIGINT
信号,因此不会导致错误出现,所以我很好奇这两个操作之间的区别。
该程序根本不捕获任何键盘动作,只是一个Python程序,其中包含一些线程/进程。 它不安装信号处理程序(尽管Python不会),并且stty -a
给出intr = ^ C
。 我怀疑可能是Ctrl + C向所有子进程/线程发送SIGINT
,而kill -INT
只发送给主进程,但这是我的怀疑。
下面是shell脚本,它发送kill -INT
...
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
发布于 2018-02-18 16:01:39
^ C
向前台进程组中的所有进程发送SIGINT
。 要使用kill
进行等价处理,您应该将信号发送到进程组(OS级概念):
kill -SIGINT -<pid>
或工作(shell级概念,流水线以&
结尾):
kill -SIGINT %
发布于 2018-02-18 17:33:10
在此描述*
Python在默认情况下安装了少量的信号处理程序:SIGPIPE被忽略(因此管道和套接字上的写入错误可以作为普通的Python异常报告),并且SIGINT被转换为KeyboardInterrupt异常。 所有这些都可以被覆盖。
因此,发送SIGINT和Ctrl+c之间的行为应该是相同的。
但是,你必须小心对待KeyboardInterrupt
,如果代码中的某个地方有一个
try:
...
except: # notice the lack of exception class
pass
这将“吃掉”KeyboardInterrupted异常。
https://stackoverflow.com/questions/-100007393
复制相似问题