首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C程序设计中的信号

C程序设计中的信号
EN

Stack Overflow用户
提问于 2020-01-23 17:38:15
回答 1查看 138关注 0票数 1

我正在阅读C11的ISO标准,我有一个很难理解的条款处理信号。

具体而言,第5.1.2.3节下的第5条描述了在抽象机器上执行程序:

当抽象机器的处理因接收信号而中断时,既不是无锁定原子对象也不是易失性 sig_atomic_t类型的对象的值未指定,浮点环境的状态也是如此。当处理程序退出时,由处理程序修改的任何对象的值(既不是无锁定原子对象,也不是易失性sig_atomic_t类型的对象)的值变得不确定,如果处理程序修改了浮点环境的状态,并且没有恢复到原来的状态,则浮点环境的状态也会变得不确定。

这是否意味着程序中的所有数据对象(如堆栈、堆和.data段中的变量)在处理信号后都将处于不确定状态,还是意味着信号处理程序实际访问的任何对象都是不确定的。

EN

回答 1

Stack Overflow用户

发布于 2020-01-24 09:50:50

这仅指在信号处理程序中和在信号处理程序外部使用的变量。

任何其他变量(不用于处理程序或仅用于处理程序)都是安全的(确定)。

例如,假设在信号处理程序中和在另一个函数中使用了一个全局变量,而该变量必须是易失性非锁定原子变量或易失性sig_atomic_t。

像这样共享的其他变量类型中的任何变量都可能是不确定的。例如,如果处理程序更改了旧值,则旧值可能仍然会在我们中间停止的函数中使用,但是新值可能会被使用(在非原子中,可能会使用某种组合--这可能是完全的胡说八道),正如所说的那样,它将是不确定的。

顺便说一下,int和指针类型应该是原子的,请参见https://www.gnu.org/software/libc/manual/html_node/Atomic-Types.html,但是我不建议假设,您应该在需要时使用原子。变量必须是可变的,因为它是使用中间函数的,请参见https://stackoverflow.com/a/42183083/8901188

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

https://stackoverflow.com/questions/59884307

复制
相关文章

相似问题

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