首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信号如何与序列点交互?

信号如何与序列点交互?
EN

Stack Overflow用户
提问于 2014-07-27 04:02:18
回答 1查看 128关注 0票数 6

C89标准规定:

代码语言:javascript
复制
At sequence points volatile objects are stable in the sense that previous
evaluations are complete and subsequent evaluations have not yet occurred.

C89标准还规定:

代码语言:javascript
复制
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中将现有的结构复制到这个易失性结构中,那么产生的机器码可能会非常大。现在,假设这个大量的机器代码正在执行,系统上的某个shell在进程上执行"kill“命令,从而引发一些信号。我的理解(或者更确切地说,我的猜测)是,进程会在复制中途中断,导致对易失性的要求被破坏,并导致结构从任何信号处理程序的角度来看都是错误的。

很明显,事情并不是这样工作的,但是它们是如何工作的呢?为了便于讨论,您可以随意假设平台是x86-64或UNIX、x86、OS或其他一些常见的UNIX。

EN

回答 1

Stack Overflow用户

发布于 2014-07-27 05:07:19

在序列点处的

易失性对象是稳定的,因为先前的评估已经完成,而后续的评估尚未发生。

这不会被违反,因为中断不是序列点。这条规则只描述了“在序列点”发生的事情。如果我们在序列点A之后和序列点B完成之前被中断,我们就不是“在”序列点A或序列点B。

当抽象机的处理因接收到信号而中断时,只能依赖于前一个序列点的对象的值。

这不会被违反。如果我们在序列点A和B之间中断,比如说在中间复制,那么在序列点A所做的所有更改都是可以依赖的。他们做完了。

能够依赖于之前的修改并不意味着您不会看到后续修改的任何效果。值是稳定的,直到将来的一些代码可以修改它们。

因此,显而易见的实现并不违反这两个要求。

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

https://stackoverflow.com/questions/24975051

复制
相关文章

相似问题

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