c - 使用 C 崩溃后监控并自动重启另一个程序

标签 c segmentation-fault ubuntu-12.04 application-restart

我一直在运行的一个应用程序(用 C++ 编写)自上次更新后随机崩溃,但在崩溃之间它运行良好,所以我想保持它运行。它因段错误而崩溃。我试过像这样编写一个简单的 C 程序:

while (1) {
    if (!program_is_running()) {
        fp = popen("/usr/bin/program", "r");
        fclose(fp);
    }
    else
        sleep(15);
}

当调用的程序出现段错误时,我的程序似乎停止了。 execsystem(或其他)调用会比 popen 更好吗?在我的谷歌冒险中,我读过(并考虑过尝试)daemontools supervision 但我对此没有任何经验,看起来使用 C 应该是一个相对简单的问题但是然后我在这里问这个问题所以也许不是......在这一点上,好奇心比真正试图保持程序运行更有趣,因为有现成的工具可以实现它。

在使用 C 的 Ubuntu 12.04 机器上重启因段错误而崩溃的程序的简单可靠方法是什么?假设 program_is_running() 为 false 返回 0,为 true 返回 PID。

最佳答案

您可以使用一个简单的 shell 脚本(如 this 中的脚本)保持程序运行。回答。

如果您坚持使用 C,可以结合使用 forkexec*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/

相关文章:

mysql - 如何在 Linux 机器上查找 MySQL 备份脚本/命令

ubuntu - 删除/var/lib/dpkg 后无法获取 debconf 版本

c - C 编程语言是否有提供词汇表等数据结构的标准库

c - 使用 itoa() 函数后 printf() 调用的奇怪行为

C - 如何将字符串数组连接到缓冲区中?

c - 调用 void 函数时出现段错误

c++ - 从文件中读取视频时 opencv 出现段错误

c++ - GetShortPathName 因网络驱动器上有中文文件夹而失败

c++ - 将中缀转换为后缀并得到段错误核心转储错误

encryption - 如何制作自动信任gpg公钥?