【问题标题】:How to make a program to restart itself? (Linux process)如何让程序自行重启? (Linux进程)
【发布时间】:2012-01-08 07:04:15
【问题描述】:

我正在尝试让我的程序自行重启,但似乎没有任何效果。我尝试使用fork(),但在杀死 the parent 进程后 the child 也被杀死了。

代码

void sigup_handler(int signum) {
    int pid = fork();
    if (pid == 0) {
        execve("prog2", NULL); 
    }
    else
        kill(getpid(), SIGTERM);
}

int main() {
    puts("Program 2 started.");
    signal(SIGHUP, sigup_handler);
    sleep(50); 
    puts("Program 2 terminated.");
    return 0;
}

【问题讨论】:

    标签: c linux process operating-system


    【解决方案1】:

    如果您只是要去kill parent,为什么还要打扰fork?只需执行exec。该程序的新实例仍将是相同的进程,但将有效地重新启动。

    【讨论】:

    • 它输出程序 2 已启动。程序 2 开始。用简单的 execve("prog2", NULL);这让我很困惑。它不应该显示“程序2终止”吗?
    • 它永远不会调用“程序 2 终止”,因为父进程已经用 kill(getpid(),...); 终止了自己;
    • 好的,那么。不管怎样,这条消息很容易通过将它放在一个进程保证终止的地方来实现。
    • 请注意,旧进程映像的文件描述符将保持打开状态!
    【解决方案2】:

    使用 2 级分叉。一个家长“监控”应用程序,它分叉孩子并监控他们的状态。如果一个孩子死了,监视器就会启动一个新的。然后孩子们自己分叉做他们必须做的任何事情。

    但是,如果您不需要应用程序的“新”副本与被杀死的应用程序具有相同的状态,那么使用 exec() 开始一个新的独立副本可能是一个更好的选择,可以节省您的时间必须有那个监视器副本。

    【讨论】:

      【解决方案3】:

      您可以使用daemon(3) 后跟execve(2)

      【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 2014-01-26
      • 2012-03-07
      • 1970-01-01
      相关资源
      最近更新 更多