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