我正在阅读C11的ISO标准,我有一个很难理解的条款处理信号。
具体而言,第5.1.2.3节下的第5条描述了在抽象机器上执行程序:
当抽象机器的处理因接收信号而中断时,既不是无锁定原子对象也不是易失性 sig_atomic_t类型的对象的值未指定,浮点环境的状态也是如此。当处理程序退出时,由处理程序修改的任何对象的值(既不是无锁定原子对象,也不是易失性sig_atomic_t类型的对象)的值变得不确定,如果处理程序修改了浮点环境的状态,并且没有恢复到原来的状态,则浮点环境的状态也会变得不确定。
这是否意味着程序中的所有数据对象(如堆栈、堆和.data段中的变量)在处理信号后都将处于不确定状态,还是意味着信号处理程序实际访问的任何对象都是不确定的。
发布于 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。
https://stackoverflow.com/questions/59884307
复制相似问题