Как установить таймаут для программы? - PullRequest
4 голосов
/ 20 июня 2009

В настоящее время я пытаюсь сделать небольшое тестовое приложение для различных задач программирования. Он запустит исполняемый файл, который сгенерирует вывод для другого файла, а затем сравнит его с ответом. Я думаю, что пока я смогу быть легким, но у меня есть проблема ...

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

Операционная система на данный момент не является проблемой, это может быть Windows или Linux, хотя я в любом случае позже переключу программу на Linux, так что было бы лучше, если бы кто-нибудь дал мне подсказку, как это сделать.

Так хватит «болтать», и я просто задам вопрос: Есть ли способ установить ограничение по времени, в течение которого программа может работать в Linux или Windows?

Ответы [ 3 ]

6 голосов
/ 20 июня 2009

Этот скрипт выглядит так, как будто он подойдет для Linux (отрывок ниже).

cleanup()
{
    kill %1 2>/dev/null             #kill sleep $timeout if running
    kill %2 2>/dev/null && exit 128 #kill monitored job if running
}

set -m               #enable job control
trap "cleanup" CHLD  #cleanup after timeout or command
timeout=$1 && shift  #first param is timeout in seconds
sleep $timeout&      #start the timeout
"$@"                 #start the job

Устанавливает команду сна на время ожидания, затем выполняет данную программу. После выхода из режима сна сценарий будет очищен и завершен (что приведет к остановке процесса).

3 голосов
/ 21 июня 2009

В Windows объекты Job могут ограничивать продолжительность выполнения процесса. Вот пример из проекта с открытым исходным кодом: sandbox.cpp См. Справочное сообщение внизу файла для информации об использовании.

1 голос
/ 20 июня 2009

Вы можете использовать темы или настроить будильник (). Ниже приведен краткий пример того, как установить будильник () в Linux.

http://www.aquaphoenix.com/ref/gnu_c_library/libc_301.html#SEC301

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

void 
catch_alarm (int sig){
    printf("Alarm event triggered\n");
    signal(sig, catch_alarm);
    exit(EXIT_SUCCESS);
}

int 
main(int argc, char *argv[]){

    signal (SIGALRM, catch_alarm);
    printf("set alarm\n"); 
    alarm(3);

    while(1){
        printf("hello world\n");
    }

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...