3

PHP を使用して、リモート コンピューターで C プログラムを実行したいと考えています。最終的な目標は、電話またはその他のコンピューターの Web ブラウザーを使用してプログラムを制御することです。

私の C プログラムは、数十分の間にさまざまなセンサーからデータを取得しています。これは Linux のコマンド ラインから実行され、コンピューター キーボードの「q」キーを押すことでオフにできます。メインスレッドは次のようなものです:

int main(){

    printf("Program is running... Press 'q' <enter> to quit\n");

    fflush(stdout);

    //create one thread per sensor

        while (getchar() != 'q'){
        }

    //ask the threads to terminate  

    return(0);
}

各スレッドは、いくつかの printf を実行して、各センサーのステータスを示します。電話でこれらの値を監視し、リモート プログラムを終了するボタンを付けたいと思います。

system()、open()、または proc_open() を使用して値を正常に監視できます。問題は、メイン プログラムの getchar です。それはphpスクリプトをハングアップさせます...

<?php

    if(isset($_POST['start'])){

        $descriptorspec = array(
           0 => array("pipe", "r"),  // // stdin est un pipe où le processus va lire
           1 => array("pipe", "w"),  // stdout est un pipe où le processus va écrire
           2 => array("file", "/tmp/error-output.txt", "a") // stderr est un fichier
        );

        $cwd = '/tmp';
        $env = array();

        $process = proc_open('/home/tristan/www/a.out', $descriptorspec, $pipes, $cwd, $env);

        if (is_resource($process)) {

            fwrite($pipes[0], 'q');

            fclose($pipes[0]);

            echo stream_get_contents($pipes[1]);
            fclose($pipes[1]);

            $return_value = proc_close($process);

            echo "La commande a retourné $return_value\n";
        }
    }
?>

使用fwrite($pipes[0], 'q');はうまくいきます fwrite($pipes[0], '');が、プログラムを実行し続けるために使用すると、phpスクリプトがハングします...

編集:成功せずにバッファリングの問題を調査しました$process = proc_open('stdbuf -i0 /home/tristan/www/a.out', $descriptorspec, $pipes, $cwd, $env);...

インタラクティブな方法で値を監視し、コマンドをプログラムに送信する方法についての手がかりを持っている人はいますか?

助けてくれてありがとう!

4

2 に答える 2

0

system() 関数内でパイプを使用して、最終的に必要なものを取得しました。

<?php

if(isset($_POST['start'])){

    system('> /tmp/progOut');
    system('mkfifo /tmp/progIn');

    $proc = popen('./a.out < /tmp/progIn > /tmp/progOut &', 'r');
}
?>
于 2013-09-10T15:14:48.153 に答える