terminate
我的示例中的变量是否必须为volatile
?我看过很多例子,其中该变量是易失性的,而另一些则不是。
标志terminate
应为volatile sig_atomic_t
:
因为处理函数可以异步调用。也就是说,处理程序可能在程序中的任何地方被意外地调用。如果两个信号在很短的间隔内到达,则一个处理程序可以在另一个处理程序中运行。最好声明为volatile sig_atomic_t
,始终以原子方式访问此类型,以避免不确定是否中断对变量的访问。volatile
告诉编译器不要进行优化并将其放入寄存器。(有关详细信息,请阅读:原子数据访问和信号处理)。另 一种参考:24.4.7原子数据访问和信号处理。此外,7.14.1.1-5中的C11标准指示只能volatile sig_atomic_t
从信号处理程序访问对象的(访问其他对象具有未定义的行为)。
我已经阅读了signal()
现在已弃用的,并使用sigaction()
。有没有真正好的例子来说明如何从上一个signal()
通话转换?我在必须创建/通过的新结构以及它们如何组合在一起方面遇到了麻烦。
以下示例(以及注释中的链接)可能会有所帮助:
// 1. Prepare struct
struct sigaction sa;
sa.sa_handler = sighandler;
// 2. To restart functions if interrupted by handler (as handlers called asynchronously)
sa.sa_flags = SA_RESTART;
// 3. Set zero
sigemptyset(&sa.sa_mask);
/* 3b.
// uncomment if you wants to block
// some signals while one is executing.
sigaddset( &sa.sa_mask, SIGINT );
*/
// 4. Register signals
sigaction( SIGINT, &sa, NULL );
是否需要再次致电signal()
?是否有类似的事情需要我关注sigaction()
?
我不清楚为什么在程序终止之前将其设置为默认操作。我认为以下段落将为您提供答案: