Я хочу перезапустить свою программу через несколько секунд, что я установил

В настоящее время я пытаюсь сделать сторожевой таймер для своего проекта.

Кроме того, я хочу сделать таймер перезапуска.

Я имею в виду, что если пройдет несколько секунд, программа запустится сначала.

Конечно, я могу использовать цикл while в основной функции. Я не хочу этого.

Я просто хочу сделать какой-нибудь класс, например, таймер или сторожевой таймер,

После того, как основная функция пройдет установленное мной время, я хочу, чтобы моя программа снова запустилась.

Есть ли хорошая идея?

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;
}

person mimic    schedule 08.10.2019    source источник
comment
У вас есть класс Timer или вы пишете одну часть вопроса?   -  person user4581301    schedule 09.10.2019
comment
Если вы не хотите создавать цикл main(), единственный вариант — выйти из текущего процесса и создать новый процесс. main() может запустить новый процесс перед выходом. Или у вас может быть отдельный вспомогательный процесс, наблюдающий за вашим основным процессом и перезапускающий основной процесс, когда он выходит.   -  person Remy Lebeau    schedule 09.10.2019


Ответы (1)


Если вы можете заставить свой код следить за часами и добровольно возвращаться после того, как прошло столько-то секунд, это обычно лучший способ; однако, поскольку вы упомянули сторожевой таймер, похоже, вы не хотите доверять свой код для этого, поэтому (при условии, что у вас есть ОС, которая поддерживает fork()), вы можете создать дочерний процесс для запуска кода, а затем родительский процесс может в одностороннем порядке kill() дочерний процесс через 5 секунд, а затем запустить новый. Вот пример, когда дочерний процесс подсчитывает случайное количество картофелин, по одному в секунду; если он попытается сосчитать более 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 и требует значительно больше усилий для реализации.

person Jeremy Friesner    schedule 09.10.2019