C++;异常和信号处理程序 我正在阅读Bjarne Stroustrup的C++设计和演化。关于异常处理和异步信号,如下所述:

C++;异常和信号处理程序 我正在阅读Bjarne Stroustrup的C++设计和演化。关于异常处理和异步信号,如下所述:,c++,exception,language-design,signal-handling,C++,Exception,Language Design,Signal Handling,异常可以用来处理信号之类的事情吗?在大多数C环境中几乎肯定不是这样。问题是C使用了像malloc这样的不可重入函数。如果在MALOC的中间发生中断并导致异常,则无法阻止异常处理程序再次执行MALOC。 一个C++实现,其中调用序列和整个运行库是围绕重新入网的要求设计的,这使得信号可以抛出异常< < /P> 作者所说的“无法阻止异常处理程序再次执行malloc”是什么意思?使函数重新进入如何使从信号处理程序抛出异常成为可能?例如,如果对malloc的调用引发了一个信号,那么如果从该信号处理程序抛出

异常可以用来处理信号之类的事情吗?在大多数C环境中几乎肯定不是这样。问题是C使用了像malloc这样的不可重入函数。如果在MALOC的中间发生中断并导致异常,则无法阻止异常处理程序再次执行MALOC。

一个C++实现,其中调用序列和整个运行库是围绕重新入网的要求设计的,这使得信号可以抛出异常< < /P>


作者所说的“无法阻止异常处理程序再次执行malloc”是什么意思?使函数重新进入如何使从信号处理程序抛出异常成为可能?

例如,如果对malloc的调用引发了一个信号,那么如果从该信号处理程序抛出异常,异常抛出逻辑可以再次调用malloc。因为malloc不是可重入的,所以最终会出现未定义的行为

处理信号的一种方法是将信号事件推送到事件队列中,然后立即从信号处理程序返回。然后,当事件循环处理信号事件时,它可以做任何它想要的,因为它不在信号处理程序的受限上下文中。

< P>函数是“可重入”的,如果它可以在执行中间被中断,并且在中断调用完成之前再次调用。另一种方法是:可以从信号处理程序中调用可重入函数。从信号处理程序中调用不可重入函数的可能性很小。唯一应该从信号处理程序内部调用的函数是那些已知可重入的函数

malloc不是可重入的。如果MALOC去KabOM,就无法判断它是否在更新所有的全局数据MalOC在后台使用以跟踪已分配数据的过程中运行KaboM。
信号处理程序与异常之间的另一个问题是:在信号处理程序中执行的代码实际上是在与主代码不同的线程中运行的。如果可以寻址该信号,则信号处理程序的返回将返回到信号发出点之后。如何在信号处理程序中抛出异常?这样做,信号处理器将不再返回!这意味着其余的执行将在信号处理程序中有效地完成。当另一个信号出现时会发生什么?这两个概念根本就不混合。重新入选只是这里的冰山一角。

< P>我认为,对于当前的C++,部分并没有太大的意义。 <>在C++中,没有办法使用异常作为信号,因为信号意味着执行一个处理程序,然后(可能)继续执行。 然而,C++异常不是这样工作的。一旦到达异常处理程序,堆栈已经回滚,并且在处理之后无法“继续”:无法到达抛出之后的语句(或者在抛出异常的函数调用之后)

信号是异步的,但不是中断的,并且在信号可能发出后继续(即使必须注意信号处理程序中的操作),异常反而会中断程序流,不可能继续

我想说,这两种思想在逻辑层面上是不兼容的,并且不管库是否可重入


可能是在C++早期设计中有一个异常的恢复选项……< >你很好地指出程序执行在抛出异常之后不能继续。