2

C/C++ のオンライン コンパイラを作成したいと考えています。

これまで、次のコードを開発しました。

<?php
error_reporting(E_ALL);
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{


    move_uploaded_file($_FILES["file"]["tmp_name"],$_FILES["file"]["name"]);
    compile();
}
function compile()
{
$a=shell_exec('gcc -o Compile Compile.c');
echo $a;
$b=shell_exec('./Compile');
echo $b;
}
?>

ファイル Compile.c がアップロードされ、その後 gcc によってコンパイルされます。私がやりたいことは次のとおりです。

  • コンパイル結果がエラーの場合、stderr からエラーを読み取り、Web ページに表示します。
  • エラーがない場合は、入力ファイルでコードを実行し、実行時間を表示します。時間が特定の値を超えた場合は、時間制限超過エラーを表示します。

インターネットを検索したところ、コンパイルステートメントが「2>&1」で追加されている場合、

$a=shell_exec('gcc -o Compile Compile.c 2>&1');

次に、コンパイル エラーの出力が割り当てられた変数 (上記の場合は $a) に返されますが、それがないわけではありません。したがって、私の問題は、エラーをチェックし、「2>&1」を追加せずにWebページに表示し、エラーがない場合は、上記の2番目のステップを実行する方法です。

4

2 に答える 2

4

proc_open() の正しい使い方は次のようになります:

$process = proc_open('gcc -o Compile Compile.c', array(
    0 => array('pipe', 'r'), // STDIN
    1 => array('pipe', 'w'), // STDOUT
    2 => array('pipe', 'w')  // STDERR
), $pipes);

if(is_resource($process)) {
    // If you want to write to STDIN
    fwrite($pipes[0], '...');
    fclose($pipes[0]);

    $stdOut = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    $stdErr = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    $returnCode = proc_close($process);
}

これにより、シェル コマンドが実行され、STDIN、STDOUT、および STDERR を詳細に制御できます。

于 2013-03-20T09:13:39.543 に答える
0

PHP には、外部プロセスを実行するための多数の関数が含まれており、それぞれに独自の一連の欠陥があります。

execこの特定のケースでは、 を使用する(および を使用して stderr を stdout にリダイレクトする)ことにより、ある程度の単純さを維持できる場合があります2>&1。戻り値は文字列ですが、役に立ちません。出力の最後の行にすぎません。ただし、2 番目の引数は出力 (行ごとのエントリ) で埋められる配列である必要があり、3 番目の引数return_varはコンパイルが成功したかどうかを示します:0成功を意味し、それ以外は失敗を意味します。

于 2012-08-27T22:56:02.463 に答える