您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

简单的Linux信号处理

简单的Linux信号处理

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()

我不清楚为什么在程序终止之前将其设置为认操作。我认为以下段落将为您提供答案:

其他 2022/1/1 18:13:58 有451人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶