-1

Linux マシンで gcc を使用して、php スクリプトから C コードをコンパイルしようとしています。ただし、C コードに無限ループが含まれていると、コンパイラがスタックします。

私のPHPスクリプトは次のようになります..

shell_exec('gcc input.c -o output 2> compile.txt');
$output=shell_exec('./output');

「input.c」ファイルは次のようになります。

#include<stdio.h.
void main()
{
      while(1)
      prinf("This is infinite loop");
}

PHPコードをコンパイルすると、

**PHP Fatal error:  Out of memory (allocated 403177472) (tried to allocate 804896768 bytes)**

タイムアウト 5 を試しました: $output=shell_exec('./output');

しかし、それは動作しますが、動作しません..

 int i;
 while(1)
 {
      scanf("%d",&i);
 }

..私のinput.cファイルで。私はたくさん検索しましたが、無駄でした.. 私は何を間違っていますか.?

4

4 に答える 4

1

最初のポイントは、スタックしているのはコンパイラではないということです。コンパイラはコードを正常にコンパイルします。コードが無限ループに入るのは実行中です。したがって、最初のコードの場合、一時停止または終了せずに実行を継続し、常に CPU を占有するため、「立ち往生している」という感覚が得られます。

2 番目のコードがどのように機能するかに関しては、入力を取得するために一時停止しているためです。しかし、その場合も、プログラムの出口を提供できませんでした。したがって、事実上、2 番目のコードは最初のコードと同じですが、CPU を独占することはありません。

この問題を修正する方法は 1 つしかありません。それは、'C' コードを変更して、出口のない無限ループが発生しないようにすることです。

例:

int i;  
while(1)  
{ 
  scanf("%d",&i);  
  if(0 == i) 
  {
    break; //Just an example as to how you can exit from an infinite loop
  }
} 
于 2012-07-13T05:49:23.833 に答える
1

ulimitプログラムの呼び出しで使用できます。たとえば、次のようにするとoutput、CPU 時間が 1 秒に制限されます。

shell_exec("ulimit -t 1; ./output")

他のリソースも制限して、outputすべてのメモリなどを使用できないようにすることをお勧めします。

(これは、絶対時間ではなく、CPU 時間を制限することに注意してください。それを行いたい場合は、 のようtimelimitに呼び出される のようなプログラムを確認する必要があるshell_exec("timelimit -T 1 ./output")と思います。)

于 2012-07-13T06:45:23.410 に答える
0

ジェイはそれの多くを非常によく説明します。残りの部分は、最初のプログラムが無限ループに入るだけでなく、無限量の出力を生成し、そのすべてを$outputに格納しようとすることです。コンピュータをクラッシュさせなかったのは幸運だったと思いますが、PHPはおそらく組み込みのメモリ制限であなたを救いました。

于 2012-07-13T05:54:58.287 に答える
0

あなたが探しているものは理論的に可能です:

停止問題について読むことができます

ただし、おそらく PHP の set_time_limit のようなものを使用できます

于 2012-07-13T06:17:54.677 に答える