2012-02-03 16 views
2

私はPHPを書いたオンラインジャッジを作ろうとしています。`exec()`の呼び出しに時間制限を強制する方法はありますか?

exec("gcc /var/www/qwerty.c -o /var/www/binary",$output,$returnval); 
print_r($output); 
exec("cat /var/www/qwe.txt | /var/www/binary",$output,$returnval); 
print_r($output); 

は、しかし、私は実行するために最大で1秒を持っているexecによって生成された各プロセスをしたい:私のコードは、現在のように見えます。私はこれを行う方法がわかりません。

exec(" (ulimit -t 1 ; gcc ... | /var/www/binary) "); 

プロセスがアクティブなCPU時間を使用している場合、もちろんそれだけが際限なくI/Oを待機していない場合は、動作していること: は、set_time_limit()は、おそらくそのためulimitを使用することができます

+2

何の世界で? – MetalFrog

+0

あなたが望むなら、証言のタイトルへの私の改善。 –

+0

@ManseUK:そのページを読んでください: 'set_time_limit()関数と設定ディレクティブmax_execution_timeは、スクリプト自体の実行時間にのみ影響します。スクリプトが実行されている最長時間を決定するときに、system()、ストリーム操作、データベースクエリなどを使用するシステムコールなど、スクリプトの実行以外で発生するアクティビティに費やされる時間は含まれません。これは、測定された時間が実際のWindowsでは当てはまりません。 ' –

答えて

4

が機能していません。

3

これは、proc_ファミリの機能を使用して実現できます。 proc_openを使用してプロセスを起動します。プロセスが戻ったり1秒が経過するまで、proc_status(ポーリングの間に少し睡眠をとって)を繰り返しポーリングしてください。プロセスが完了したことを示すproc_statusを指定せずに1秒が経過する場合は、proc_terminate(またはproc_close)を使用して無効にし、適切な処置を行ってください。

私は、PHPスクリプトで外部プロセスを生成することは良いアイデアだと言っているわけではありません。

6

@Adamライトによって示唆されているように私はproc_機能を使用しますが、Linuxのような環境への迅速な代替は、あなたのコマンドの前にGNU timeoutコマンドを使用することです:

// If it took more than 1 second, $returnval will got the exit code 124 
exec('timeout 1 gcc /var/www/qwerty.c -o /var/www/binary', $output, $returnval); 
関連する問題