我一直在运行的应用程序(用C ++编写)自上次更新后随机崩溃,但在崩溃之间运行良好,所以我想让它继续运行。它与segfault崩溃。我尝试编写一个这样的简单C程序:
while (1) {
if (!program_is_running()) {
fp = popen("/usr/bin/program", "r");
fclose(fp);
}
else
sleep(15);
}
当被调用的程序段错误时,我的程序似乎停止了。 exec
或system
(或其他)调用是popen
更好的选择吗?在我的谷歌冒险中,我已经阅读了(并考虑尝试)daemontools监督,但我没有任何经验,似乎它应该是一个相对简单的事情使用C然后在这里我问这样的问题所以也许不是......在这一点上,它比真正试图保持程序运行更有好奇心,因为有现成的工具来完成它。
使用C在Ubuntu 12.04计算机上重启程序崩溃的程序有什么简单可靠的方法?假设program_is_running()
返回0
表示false,PID表示true表示。
答案 0 :(得分:5)
您可以使用像this answer。
中的简单shell脚本来保持程序运行如果您坚持使用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 */
}
}