信号如何与序列点相互作用?

时间:2014-07-26 20:02:18

标签: c++ c linux signals volatile

C89标准规定:

At sequence points volatile objects are stable in the sense that previous
evaluations are complete and subsequent evaluations have not yet occurred.

C89标准还指出:

When the processing of the abstract machine is interrupted by receipt of a
signal, only the values of objects as of the previous sequence point may be
relied on.

这些要求让我感到困惑,因为我无法想象它们会如何 实际上是实施的。我对x86-64只有基本的了解 汇编程序,但这是我脑子里的东西。让我们说我们有 一个易变的结构,它是很多千字节。如果您复制现有的 结构化为C中的这个volatile结构,然后生成的机器代码可能 非常大。现在,让我们说这大量的机器代码是 执行,系统上的一些shell执行“kill”命令 过程中,引起一些信号的升高。我的理解(或者说我的理解) 猜测)这个过程会在中间复制中断,导致 要破坏volatile的要求,并导致结构格式错误 任何信号处理程序的视角。

显然事情实际上并不像这样,但实际上他们是如何做的 工作?为了论证,请随意假设该平台是x86-64 或者x86 Linux,Windows,OS X或其他一些常见的UNIX。

1 个答案:

答案 0 :(得分:3)

  

在序列点处,易失物体在前一个意义上是稳定的   评估已完成,后续评估尚未完成。

这不会被违反,因为中断不是序列点。此规则仅描述在序列点"发生的情况。如果我们在序列点A之后和序列点B完成之前被中断,我们就不会在" at"序列点A或序列点B。

  

当抽象机的处理因收到a而中断时   信号,只有前一个序列点的对象值可能是   依靠。

这不会被违反。如果我们在序列点A和B之间中断,例如在中间复制中,则可以依赖在序列点A处进行的所有更改。他们已经完成了。

能够依赖先前的修改并不意味着您不会看到后续修改的任何影响。在未来的某些代码可以修改它们之前,值是稳定的。

因此,明显的实施并未违反任何一项要求。