2009-06-20 30 views
4

私は現在、さまざまなプログラミング作業のための小さなテストアプリケーションを作成しようとしています。実行可能ファイルを実行し、別のファイルに出力を生成し、それを回答と比較します。これまでは簡単にできると思っていますが、問題があります。プログラムのタイムアウトを設定するにはどうすればよいですか?

この実行可能ファイルが実行できる時間(たとえば1秒または2秒)を制限します。だから私は時間制限に達すると、プログラムを停止/終了するオプションがあるのだろうと思っていた。

今のオペレーティングシステムはWindowsやLinuxでも問題ありませんが、後でプログラムをLinuxに切り替えることができますので、誰かが私にこのことをどうやってヒントを与えることができればよいでしょう。

私はちょうど質問をします。 LinuxやWindowsのどちらでもプログラムを実行できる時間制限を設定する方法はありますか?

+1

テストアプリケーションをどの言語で書いていますか?私はかなりのものがそれに依存していることを意味します。おそらくスレッド化はオプションであるか、タイムアウト/イベントを使用して機能を組み込むことができます。私はこれが潜在的な答えに不可欠だと思います。 – merkuro

答えて

6

This script 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 
"[email protected]"     #start the job 

スリープコマンドをタイムアウトに設定してから、指定したプログラムを実行します。スリープが終了すると、スクリプトはクリーンアップして終了します(したがって、生成されたプロセスを停止します)。

1

スレッドを使用することも、アラーム()を設定することもできます。以下は、Linuxでalarm()を設定する方法の簡単な例です。 Windowsので

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

、ジョブオブジェクトがどのくらい自分の含まれるプロセスの実行のために制限することができます。次に、オープンソースプロジェクトの例を示します。sandbox.cpp使用方法については、ファイルの最後にあるヘルプメッセージを参照してください。

+0

このようなシンプルなユーティリティを探していました。 1つの場所でソースと実行可能ファイルを+1します。 – vmrob

関連する問題