0

我有一个用 C 语言编写的应用程序,在 Linux 设备服务器上运行。如果应用程序崩溃或挂起,我希望系统重新启动。设备服务器附带了一个我认为实现此功能的示例应用程序,但我不确定。通过从中获取似乎实现此功能的东西,我有以下骨架:

int terminate=0;

int main () {

  struct sigaction     sigact;

  sigact.sa_handler = sighandler;
  sigemptyset(&sigact.sa_mask);
  sigact.sa_flags = 0;
  sigaction(SIGTERM,&sigact,0); 

  while (terminate == 0) 
  {
    // my main application functions
  }

  SDK_reboot();  // reboots my device server

}

void sighandler(int sig)
{
  if (sig == SIGTERM)
    terminate = 1;
}

我基本上想了解上面代码中发生了什么,如果有必要,改变它以满足我的需要。是 'sigaction(SIGTERM,&sigact,0);' 导致 SIGTERM 响应我的应用程序挂起或崩溃的行?如果不是,那么正确的代码是什么?另外,一般来说,以上是在应用程序崩溃/挂起时实现重启的好方法吗?还是我偏离了轨道?提前非常感谢。

4

2 回答 2

0

不,不是 SIGTERM,而是 SIGCHLD。换句话说,当 main 的分叉子进程之一退出时,循环终止。

这看起来像是应用程序的一部分,它派生出实际的“工作进程”并在它退出时重新启动。注意:挂起不会退出。这不会检测到无限循环或其他挂起。

于 2012-09-24T16:35:43.227 回答
0

重启电路板最可靠的方法是使用硬件看门狗定时器。此解决方案将有效地检测应用程序崩溃和挂起。

嵌入式 linux 内核通常包含看门狗驱动程序(/dev/watchdog)。在启用看门狗支持的情况下重建内核。

在应用程序内部打开 /dev/watchdog,并经常写入它以防止内核重置,至少每分钟一次。每次写入都会将重启时间延迟一分钟。在一分钟不活动后,看门狗硬件将导致复位。(见http://linux.die.net/man/8/watchdog

参考您的代码,您可以在应用程序启动后立即打开 /dev/watchog,然后在 while 循环中写入它。如果应用程序只有一个线程,这将是正确的。如果线程更多,您需要想出一些更棘手的东西。

还有一种方法可以检测应用程序崩溃。主要思想与该解决方案中的相同:https://superuser.com/questions/223449/auto-restart-process-on-crash。该脚本可以用 C 重写。它涉及到使用 fork()、execve()、waitpid()。

于 2012-09-24T21:46:55.653 回答