<p>不会调用您的python信号处理程序,因为python会将信号处理程序的执行推迟到下一个字节码指令执行之后—请参见<a href="https://docs.python.org/3.6/library/signal.html#execution-of-python-signal-handlers" rel="nofollow noreferrer">the library documentation for signal, section 18.8.1.1</a>:</p>
<blockquote>
<p>A Python signal handler does not get executed inside the low-level (C) signal handler. Instead, the low-level signal handler sets a flag which tells the virtual machine to execute the corresponding Python signal handler at a later point(for example at the next bytecode instruction). This has consequences:</p>
<ul>
<li>It makes little sense to catch synchronous errors like <code>SIGFPE</code> or <code>SIGSEGV</code> that are caused by an invalid operation in C code. Python will return from the signal handler to the C code, which is likely to raise the same signal again, causing Python to apparently hang. From Python 3.3 onwards, you can use the <code>faulthandler</code> module to report on synchronous errors.</li>
<li>A long-running calculation implemented purely in C (such as regular expression matching on a large body of text) may run uninterrupted for an arbitrary amount of time, regardless of any signals received. The Python signal handlers will be called when the calculation finishes.</li>
</ul>
</blockquote>
<p>这样做的原因是,信号可以在任何时候到达,可能在python指令执行的一半时间到达。VM开始执行信号处理程序是不安全的,因为VM处于未知状态。因此,python安装的实际信号处理程序只设置一个标志,告诉VM在当前指令完成后调用信号处理程序。在</p>
<P>如果信号在C++函数执行期间到达,则信号处理程序设置标志并返回到C++函数。在</p>
<P>如果信号处理程序的主要目的是允许C++函数被中断,那么我建议您放弃Python信号处理程序,并安装一个C++信号处理程序,它设置一个标志,该标志触发C++代码中的早期退出(可能返回一个指示中断的值)。在</p>
<P>这种方法允许你使用相同的代码,不管你是用Python、C++或是另一个绑定调用你的代码。在</p>