2012-02-10 25 views
1

Cプログラムの実行を数分の1秒(ミリ秒単位)または使用するメモリのサイズで強制終了できますか?このようにして、印刷コンテンツを無限ループで制限し、バッファオーバーランを制限したいと考えています。数分後に強制的にCプログラムの実行を終了することができます

私はcygwin GCC4.3コンパイラを使用しており、PHPソースコードを入力として受け取り、対応する出力を表示するPHPのツールとして実装したいと考えています。

PS - 1.私のCの問題には非常に単純な算術演算しか含まれないため、ミリ秒と言います。 2.実行時間を制限するために、PHPでset_time_limit()を実行すると、PHPスクリプトの実行時間全体がexec()に割り当てられた時間ではなく制限されます。

+2

タイマーを使い、タイマーが切れるとプログラムを 'abort()'または 'exit()'するだけです。 –

+1

この方法でバッファオーバーランを防止することはできません。バッファオーバーランを実際に制限するには、 '-fstack-protector-all'フラグを付けてCソースをコンパイルする必要があります。 –

+0

@Als私はCプログラムでタイマーを使うことができませんコンパイル時やPHPスクリプトで処理する必要があります –

答えて

1

alarm()関数を使用できるはずです。 unistd.hにありますが、これはPOSIX.1-2001の関数であり、cygwinで利用できるはずです。 SIGALRMが処理されない場合、プロセスは強制終了されます。

それを試してみてください。

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

int main() { 

    alarm(5); /* raise alarm after 5 seconds */ 

    while(1) { 
      printf("Running forever\n"); 
    } 
    return 0; /* never reached */ 
} 

更新

ジョナサンが指摘するように、あなたが代わりに(また、POSIXに準拠)をsetitimerが使用できるようアラーム(2)はわずか数秒で動作

#include <stdio.h> 
#include <sys/time.h> 

int main() { 

    /* --CUT HERE-- */ 
    struct itimerval timer; 
    timer.it_value.tv_sec = 0; 
    timer.it_value.tv_usec = 5000; /* 5 milliseconds */ 
    timer.it_interval.tv_sec = 0; 
    timer.it_interval.tv_usec = 0; 

    setitimer(ITIMER_REAL, &timer, NULL); 
    /* --END CUT-- */ 
    while(1) { 
      printf("Running forever\n"); 
    } 
    return 0; /* never reached */ 
} 

場合あなたのシステム上で上記の作品、 コピーコードから - ここにカットして - あなたのメインに貼り付ける;

は、あなたのシステムがPOSIX 2008ノートからnanosleep()それを持っているかどうかを調査することをお勧めします例

+1

'alarm()'が何千ミリ秒単位で動作することを除いて(別名「秒」)... –

+0

@Ahmed MAsud無限ループを実行するgcc .exeファイルを作成します秒単位で表します。私が永久に実行する.exeを読み込もうとすると、問題が発生します。 –

+0

@JonathanLefflerジョナサンを指摘してくれてありがとう、固定 –

2

ためSet stack size with setrlimit() and provoke a stack overflow/segfault

を参照してくださいはsetrlimitを使用してみてくださいメモリを制限する

更新2

たとえ時間をナノ秒単位で指定することができたとしても、システムはサブミリ秒のタイミングを非常に信頼できるものにすることができないことがあります。

正式には廃止されましたが、代わりにµ-sleep()(綴りはusleep())です。マイクロ秒を含む時間を指定します。 Googleの「スリープウインドウ」のクイック検索では、ネイティブのWindowsの代替手段としてSleep()が示唆されています。

も参照してください。Sleep less than one millisecond

も参照してください。Command line command to auto-kill a command after a certain amount of time。プログラムは現在、サブ秒のタイミングに対処するために書かれていませんが、使用するサブ秒のタイミングインタフェースを決定すると、必要な適応は非常に難しくありません。

0

は、私が過去に似た何かを行っている、と私は使用されるアーキテクチャは だった - 親C-プログラムを持っていると言うmain.cの、(これは手立て生産コードではありません注意してください、ともないことを保証して以下のようなコードコンパイル、以下のコードはデモンストレーションの目的のみのものです)。

// ---------------------- main.c ---------------- 
int main_child(); // the body is defined in "your_test_source.c" 

int main() 
{ 
    pthread_t tid; 

    // create child thread 
    pthread_create(tid, NULL, main_child, NULL); 

    // start monitoring the child thread 
    // ... 
    // you can kill child thread by calling pthread_exit 
    // and check for memory usage by system calls. 

    return 0; 
} 

#define main main_child 
    // we change the main function to main_child 
    #include "your_test_source.c" 
#undef main 
// ---------------------- end ------------- 

your_test_source.c - これはテストファイルです。

これは、コンパイルとデバッグのためのレイヤーを追加しますが、機能します。

+0

無限ループやメモリ消費の問題が解決されず、コードを変更したくありません。コンパイル時またはPHP –

0

メモリのサイズを制限するには、動的メモリ割り当てまたは再帰を使用しないでください。その後、メモリ要件が制限されていることを確認することができます(つまり、安全性が重要なシステムのコーディング規格です)。

時間要件については、秒グラニュラリティの制限で暮らし、実行を1秒に制限する理由は何ですか?

+0

で制限したいと思います。実際にコンパイル時にこれらのすべてをチェックしたいのですが、プログラムには何かが含まれている可能性があります。制限したくありません。 –

+0

コンパイル時に実行時間を制限することはできません。プログラムを実行するとき、実行時間はプロセッサ/ディスク/メモリが何をしているかによって異なります。しかし、上記のようにメモリ要件の上限を置くことができます。 –

+0

Cプロマームのメモリ上限を設定する方法を教えてください –

関連する問題