首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ctrl-C和SIGINT有什么区别?

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

Stack Overflow用户
提问于 2018-02-18 07:43:29
回答 2查看 0关注 0票数 0

我一直在调试收到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
EN

回答 2

Stack Overflow用户

发布于 2018-02-18 16:01:39

^ C向前台进程组中的所有进程发送SIGINT。 要使用kill进行等价处理,您应该将信号发送到进程组(OS级概念):

kill -SIGINT -<pid>

或工作(shell级概念,流水线以结尾):

kill -SIGINT %
票数 0
EN

Stack Overflow用户

发布于 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异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档