栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

简单的Linux信号处理

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简单的Linux信号处理

[Q-3]

terminate
我的示例中的变量是否必须为
volatile
?我看过很多例子,其中该变量是易失性的,而另一些则不是。

标志

terminate
应为
volatile sig_atomic_t

因为处理函数可以异步调用。也就是说,处理程序可能在程序中的任何地方被意外地调用。如果两个信号在很短的间隔内到达,则一个处理程序可以在另一个处理程序中运行。最好声明为

volatilesig_atomic_t
,始终以原子方式访问此类型,以避免不确定是否中断对变量的访问。
volatile
告诉编译器不要进行优化并将其放入寄存器。(有关详细信息,请阅读:原子数据访问和信号处理)。另
一种参考:24.4.7原子数据访问和信号处理。此外,7.14.1.1-5中的C11标准指示只能
volatilesig_atomic_t
从信号处理程序访问对象的(访问其他对象具有未定义的行为)。

[Q-4]
我已经阅读了

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);// 4. Register signals sigaction( SIGINT, &sa, NULL );

参考资料:

  1. 《 Linux编程入门》,第4版:在本书中,
    sigaction()
    “第11章:进程和信号”中很好地解释了您的代码。
  2. 在sigaction的文档,其中包括一个例子(快速学习)。
  3. GNU C库:信号处理
    *我从1开始,目前我正在阅读3 GNU库

[Q-5] 是否需要再次致电

signal()
?是否有类似的事情需要我关注
sigaction()

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

处理信号

信号调用仅对 一个 信号出现建立信号处理。在调用信号处理函数之前, 库会重置信号,以便在再次出现相同信号时执行默认操作
。重置信号处理有助于防止无限循环,例如,如果在信号处理程序中执行的操作再次引发相同的信号。如果希望您的处理程序每​​次出现时都用于信号,则必须在处理程序中调用signal来恢复它。您应谨慎恢复信号处理。例如,如果您继续恢复

SIGINT
处理,则可能会失去中断和终止程序的能力。

signal()
函数仅定义下一个接收到的信号的处理程序, 之后将恢复默认处理程序 。因此, 如果程序需要使用非默认处理程序继续处理信号
,则有必要调用信号处理
signal()
程序。

阅读讨论以获取更多参考:何时重新启用信号处理程序。

[Q-1a] 是否需要信号处理?

是的,Linux将为您进行清理。例如,如果您不关闭文件或套接字,则Linux将在进程终止后进行清理。但是Linux可能没有必要立即执行清理,并且可能需要一些时间(可能是为了保持较高的系统性能或其他一些问题)。例如,如果您不关闭tcp-
socket并且程序终止,则内核将不会立即关闭套接字以确保所有数据都已传输,TCP尽可能保证传送。

[Q-1b] 因此,我可以仅用无限循环替换信号处理程序,然后让OS正常退出线程,取消分配内存等吗?

不,操作系统仅在程序终止后才执行清理操作。进程执行时,分配给该进程的资源不会被OS占用。(操作系统无法知道您的进程是否处于无限循环中-这是无法解决的问题)。如果您希望进程终止后,操作系统为您执行清理操作,那么您就不需要处理信号(即使您的进程被信号异常终止)。

[Q] 我要完成的所有工作都是为了使我的:main循环运行,直到

ctrl``c
或断开电源或发生真正的不良情况。

不,有限制!您无法捕获所有信号。某些信号是不可捕获的,例如

SIGKILL
并且
SIGSTOP
都是终止信号。引用一:

[—宏:int
SIGKILL
](http://www.gnu.org/software/libc/manual/html_node/Termination-

Signals.html)

SIGKILL
信号用于导致程序立即终止。它 不能被处理或忽略,因此总是致命的。 它也 没有 能够阻止这个信号。

我不确定,但也许您可以在Windows系统中执行以下操作:通过编写TSR(某种内核模式挂钩)。我从论文撰写时就记得某些病毒甚至无法从任务管理器中终止,但我也相信它们会通过管理员权限欺骗用户。

希望这个答案对您有帮助。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/400890.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号