如何为程序设置超时时间?

4

我目前正在尝试创建一个用于各种编程任务的小型测试应用程序。它将运行可执行文件,该文件将在另一个文件上生成输出,然后将其与答案进行比较。到目前为止,我认为这很简单,但是我遇到了一个问题...

我想限制可执行文件可以运行的时间,例如1秒或2秒。所以我想知道是否有选项,如果达到时间限制,则停止/退出程序。

目前操作系统不是问题,它可以是Windows或Linux,尽管我稍后会将程序切换到Linux,因此如果有人可以给我一些提示,那就更好了。

够了"唠叨"的话,我来问问题了:是否有方法在Linux或Windows上设置程序可以运行的时间限制?


1
你用什么语言编写测试应用程序?我的意思是很多事情都取决于它。也许线程是一个选项,或者可以使用超时/事件的内置功能。我认为这对潜在的答案至关重要。 - merkuro
3个回答

6

这个脚本 看起来可以在 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
在Windows中,作业对象可以限制其包含的进程运行的时间。以下是一个开源项目的示例:sandbox.cpp。有关使用信息,请参见文件底部的帮助消息。

一直在寻找像这样简单的实用程序。+1,因为源代码和可执行文件在同一个位置。 - vmrob

1

你可以使用线程或设置alarm()。以下是在Linux中设置alarm()的快速示例。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接