c – Linux中的SEH等效或如何处理OS信号(如SIGSERV)并继续
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – Linux中的SEH等效或如何处理OS信号(如SIGSERV)并继续,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1726字,纯文字阅读大概需要3分钟。
内容图文
我目前正在开发一个单元测试框架,用户可以在其中创建测试用例并在框架中注册.
我还想确保如果任何用户测试代码导致崩溃,它不应该崩溃整个框架但应该被标记为失败.为了使这项工作,我编写了以下代码,以便我可以在沙盒功能中运行用户代码
bool SandBox(void *(*fn)(void *),void *arg, void *rc)
{
#ifdef WIN32
__try
{
if (rc)
rc = fn(arg);
else
fn(arg);
return true;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return false;
}
#else
#endif
}
这在Windows上运行得很好,但我希望我的框架是可移植的,为了这样,我想确保posix环境的类似功能.
我知道C信号处理程序可以拦截OS信号,但是将信号处理机制转换为SEH框架有一些我无法解决的挑战
>即使我的程序收到信号,如何继续执行?
>如何将执行控制从失败位置跳转到可用于错误处理的块(类似于除外)?
>我如何清理资源?
另一种可能性是我在使用自己的信号处理程序在一个单独的线程上运行用户测试代码并从信号处理程序终止线程,但又不确定这是否可行.
所以在我超越之前,如果他们意识到解决这个问题/情况的更好解决方案,我希望得到社区的帮助.
解决方法:
正如您所说,您可以通过signal()或sigaction()捕获SIGSEGV.
继续是不可取的,因为这将是未定义的行为,即您的内存可能已损坏,这可能会让其他测试用例失败(甚至过早终止您的整个过程).
是否可以逐个运行测试用例作为子进程?这样,您可以检查退出状态,并检测它是否干净,错误或由于信号而终止.
在单独的线程中运行测试用例会遇到同样的问题:在测试用例和驱动测试用例的代码之间没有内存保护.
建议的方法是:
fork()创建子进程.
在子进程中,您执行()测试用例.这可以是具有不同参数的相同二进制文件以选择某个测试用例).
在父进程中,您调用waitpid()以等待测试用例的终止.您从父进程中的fork()调用中收到了pid.
使用WIFEXITED,WEXITSTATUS,WIFSIGNALED,WTERMSIG宏评估子进程状态.
如果您的测试用例需要超时,您还可以为SIGCHLD安装处理程序.如果首先超时,则kill()子进程.请注意,您只能从信号处理程序中调用某些功能.
再说一点:execve()并不是真的需要.您可以继续直接调用指定的测试用例.
内容总结
以上是互联网集市为您收集整理的c – Linux中的SEH等效或如何处理OS信号(如SIGSERV)并继续全部内容,希望文章能够帮你解决c – Linux中的SEH等效或如何处理OS信号(如SIGSERV)并继续所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。