下面是我的程序的运行方法,出现了由于出现段错误导致程序终止时未调用注册的处理程序的情况。
是否存在当发生段错误时可以终止注册的处理程序而无需调用的情况?
- 初始化程序A时,通过signal()函数注册处理程序。( SIGSEGV, SIGABRT, SIGFPE, SIGTERM )
- fork() -> waitpid() 程序 A 在程序 B 中
- Aging
- A 程序中由于未知原因发生段错误
- B 程序的 waitpid 状态被传递给段错误(11)。
- A 程序中注册的处理程序不被调用并结束。
格式良好、定义良好的 C++ 应用程序永远不会导致段错误。
段错误是未定义行为的结果;但是,当发生未定义的行为时,根据定义,您不能期望任何特定的结果或行为。您不希望由于未定义的行为而发生段错误,即使发生,您也不能期望SIGSEGV
处理程序将产生任何预期的结果。
可以给出的示例数量没有限制。例如,段错误处理程序尝试删除在段错误之前创建的临时文件。不幸的是,未定义的行为除了导致段错误之外,还导致存储临时文件名称的缓冲区损坏。段错误处理程序失败。或者,更好的是,损坏的文件名缓冲区恰好与另一个文件的名称匹配,并且它被错误地删除了。如果您以 root 身份运行,并且损坏的文件名缓冲区偶然最终包含“/bin/bash”,那么您刚刚将您的计算机变成了无法启动的砖块。
许多其他的可能性也可能发生,仅限于一个人的想象力。您没有描述您的 sigsegv 处理程序尝试执行的操作,但这并不重要。无论它尝试做什么,都不能保证始终有效。为时已晚,当它被调用时,未定义的行为已经发生了,从那时起,您就不会期望发生任何事情。
因此,无论段错误处理程序尝试做什么,它都无法保证它能够完成其任务。当段错误处理程序被调用时,程序其余部分的状态及其数据是未定义和未指定的。
这就是为什么当出现导致段错误的错误时,正确的处理方法是找出段错误的原因,找到错误并修复它。任何通过捕获信号和清理来补救这种情况的尝试充其量只是一次冒险,并不能保证总是成功。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)