1

を使用してプロセスを開き、proc_open()しばらくusleep()してからプロセスのステータスを確認します。プロセスがまだ実行されている場合は、それを実行proc_terminate()します。

問題は、proc_terminate()プロセスが終了するのを待たずにスクリプトを継続して使用する場合です (これは正常です)が、時間が経ってもプロセスは終了しません。

プロセスは、最初にstdoutに出力され、次に無限ループに入る.exeファイルです。hello

私のPHPスクリプト:

<pre>
<?php

$descriptorspec = array(
    1 => array('pipe', 'w')
    );
$process = proc_open("C:/wamp/www/my-project/run.exe", $descriptorspec, $pipes);

if (is_resource($process)) {
    usleep(2.5*1000000); // wait 2.5 secs

    $status = proc_get_status($process);
    if ($status['running'] == true) {
        proc_terminate($process);
        echo "Terminated\n";
    } else {
        echo "Exited in time\n";
        echo "EXIT CODE : {$status['exitcode']}\n";
        echo "OUTPUT :\n";

        while (!feof($pipes[1]))
            echo fgets($pipes[1]);

        fclose($pipes[1]);
        proc_close($process);
    }
}

?>
</pre>

この C++ ファイルをコンパイルすると、次のようになります.exe

#include <iostream>
using namespace std;

int main() {
    cout << "hello";
    while (1);
    return 0;
}

なぜこれが起こるのか誰か知っていますか?:(

4

2 に答える 2

2

proc_terminate()Windows ではうまく動作しません。

taskkill適切な回避策は、コマンドを呼び出すことです。

function kill($process) {
    if (strncasecmp(PHP_OS, 'WIN', 3) == 0) {
        $status = proc_get_status($process);
        return exec('taskkill /F /T /PID '.$status['pid']);
    } else {
        return proc_terminate($process);
    }
}
于 2015-01-20T12:56:50.373 に答える
1

proc_terminateプロセスを実際に終了するのではなく、SIGTERMプロセス自体を終了するように求めるシグナルをプロセスに送信します。

SIGTERM問題は、テスト実行可能ファイルがシグナルをリッスンしていないため、無視されていることだと思います。

POSIX システムでは、2 番目のパラメーターを使用して を送信できますSIGKILL。これは、基本的に OS にプロセスを終了するように要求するため、より適切に機能する可能性があります。Windows では、これが何をするのかわかりません。

ただし、プロセスはとにかくシグナルを処理する必要があります。テスト用にシグナル ハンドラを exe に簡単に追加できます。

#include <csignal>
#include <iostream>
#include <thread>

using namespace std;

void signal_handler(int signal)
{
    cout << "received SIGTERM\n";
    exit(0);
}

int main()
{
    // Install a signal handler
    std::signal(SIGTERM, signal_handler);

    cout << "starting\n";

    while (1)
        std::this_thread::sleep_for(std::chrono::seconds(1));

    return 0;
}

sleep_forexe が CPU を 100% 占有しないように、 も追加されていることに注意してください。

上記がうまくいかない場合は、プロセスとその子を強制終了するために使用することについて、ここのコメントにも議論があります。posix_kill()

于 2013-10-21T03:22:01.587 に答える