0

目前,我尝试为我的项目做一个看门狗。

另外,我想制作一个重启计时器。

我的意思是如果几秒钟过去了,程序将从第一个开始。

当然,我可以在 main 函数中使用 while 循环。我不想要这个。

我只想做一些课程,例如计时器或看门狗,

在 main 函数经过我设置的时间后,我想让我的程序重新启动。

有什么好主意吗?

int main(void)
{
  Timer timer(5) // setting my timer to 5 secs

  //If time takes over the 5 secs in this loop, 
  //I want to restart the main loop.
  while(1)
  {
    //Do Something...
  }

  return 0;
}
4

1 回答 1

1

如果您可以让您的代码密切关注时钟并在经过这么多秒后自愿返回,那通常是最好的方法;但是,由于您提到了看门狗,听起来您不想信任您的代码来执行此操作,因此(假设您有一个支持fork()的操作系统)您可以生成一个子进程来运行代码,然后父进程可以在 5 秒后单方面kill()子进程,然后启动一个新进程。这是一个例子,一个子进程计算随机数量的土豆,每秒一个;如果它试图计算超过 5 个,它将被父进程杀死。

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

// The code you want to be able to abort and restart would go in here
static void FunctionThatMightTakeALongTime()
{
   srand(time(NULL));  // just so we get different random values each time

   const int countTo = (rand()%12)+1;
   for (int i=0; i<countTo; i++)
   {
      printf("%i potato... (out of %i)\n", i+1, countTo);
      sleep(1);
   }
}

int main(int argc, char ** argv)
{
   while(1)
   {
      pid_t pid = fork();
      if (pid == -1)
      {
         perror("fork");  // fork() failed!?
         return 10;
      }
      else if (pid == 0)
      {
         // We're in the child process -- do the thing
         printf("Starting child process...\n");
         FunctionThatMightTakeALongTime();
         printf("Child process completed!\n");
         return 0;
      }
      else
      {
         // We're in the parent/watchdog process -- wait
         // 5 seconds, and then if the child process is
         // still running, send it a SIGKILL signal to kill it.
         // (if OTOH it has already exited, the SIGKILL isn't
         // required but it won't do any harm either)
         sleep(5);

         printf("Watchdog:  killing child process now\n");
         if (kill(pid, SIGKILL) != 0) perror("kill");

         // Now call waitpid() to pick up the child process's
         // return code (otherwise he'll stick around as a zombie process)
         if (waitpid(pid, NULL, 0) == -1) perror("waitpid");
      }
   }
}

注意:如果您的操作系统不支持fork()(即您的操作系统是 Windows),这种技术仍然是可行的,但它需要使用特定于 Windows 的 API,并且要实现的工作量要大得多。

于 2019-10-09T05:05:49.070 回答