我一直在运行的一个应用程序(用 C++ 编写)自上次更新后随机崩溃,但在崩溃之间它运行良好,所以我想保持它运行。它因段错误而崩溃。我试过像这样编写一个简单的 C 程序:
while (1) {
if (!program_is_running()) {
fp = popen("/usr/bin/program", "r");
fclose(fp);
}
else
sleep(15);
}
当调用的程序出现段错误时,我的程序似乎停止了。 exec
或 system
(或其他)调用会比 popen
更好吗?在我的谷歌冒险中,我读过(并考虑过尝试)daemontools supervision 但我对此没有任何经验,看起来使用 C 应该是一个相对简单的问题但是然后我在这里问这个问题所以也许不是......在这一点上,好奇心比真正试图保持程序运行更有趣,因为有现成的工具可以实现它。
在使用 C 的 Ubuntu 12.04 机器上重启因段错误而崩溃的程序的简单可靠方法是什么?假设 program_is_running()
为 false 返回 0
,为 true 返回 PID。
最佳答案
您可以使用一个简单的 shell 脚本(如 this 中的脚本)保持程序运行。回答。
如果您坚持使用 C,可以结合使用 fork
、exec*
和 waitpid
来让进程无限期地运行。尝试类似(未经测试)的方法:
while (1) {
int status;
pid_t pid = fork();
if (-1 == pid) { perror("fork failed!"); exit(EXIT_FAILURE); }
if (0 == pid) {
/* Child */
execlp("/usr/bin/program", NULL);
perror("execlp failed!");
exit(EXIT_FAILURE);
}
waitpid(pid, &status, 0);
if (!WIFSIGNALED(status) || WTERMSIG(status) != SIGSEGV) {
exit(EXIT_SUCCESS);
/* The process didn't die because of a SIGSEGV, lets keep it dead */
}
}
关于c - 使用 C 崩溃后监控并自动重启另一个程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21807194/