Linux下的segfault自重启程序

Wax*_*ead 3 c linux restart recover segmentation-fault

在Linux下,通过在崩溃处理程序中捕获异常(例如在段错误上),程序在崩溃时重启自身的最佳方法是什么?

Any*_*orn 11

最简单的是

while [ 1 ]; do ./program && break; done
Run Code Online (Sandbox Code Playgroud)

基本上,你运行程序,直到它返回0,然后你打破.


dmc*_*kee 7

SIGSEGV可以被捕获(请参阅man 3 signalman 2 sigaction),程序可以调用其exec自身的一个函数来重新启动.同样,对于大多数运行时崩溃(SIGFPE,SIGILL,SIGBUS,SIGSYS,...).

不过,在做这个之前我会考虑一下.对于unix程序来说,这是一个相当不寻常的策略,你可能会让你的用户感到惊讶(也不一定以愉快的方式).

在任何情况下,如果在死亡之前有任何想要清理的资源,请务必不要自动重启SIGTERM,否则愤怒的用户会使用SIGKILL,你会留下一团糟.


lla*_*ram 6

您可以拥有一个循环,在其中,您fork()可以在子项中执行实际工作,并等待子项并在父项中检查其退出状态.您还可以使用以类似方式监视和重新启动程序的系统,例如daemontools,runit等.