1

重複の可能性:
bash:exec'dプロセスにバッファリングされていないstdoutを強制します

バイナリ(fceux、nesエミュレーター)のstdoutを読み取って情報を取得し、試行している遺伝的アルゴリズムの特別な入力を受け取ったときにそれを強制終了する必要があります。つまり、基本的に問題は、プログラムが出力をフラッシュしないため、プロセスが終了したときにのみ出力を受け取ることですが、それを強制終了することになっているため、出力が終了することはありません。

では、フラッシュされていないバッファの子から読み取る方法はありますか?C ++にない場合でも、フラッシュを追加して、最終的にC ++で読み取ることができます(ただし、少し汚れています)。私もPythonを使ってみましたが、それを行う方法も見つかりませんでした。

これが私のコードのチャンクです:

int fd[2];
pid_t pid;
pipe (fd);
if ((pid = fork ()) == 0)
{
    close (fd[0]);
    dup2 (fd[1], STDOUT_FILENO);
    execl ("/usr/bin/fceux", "fceux", "Super Mario Bros.zip", NULL)
    perror ("fork");
}
else
{
    close (fd[1]);
    char buf[1];
    std::string res;
    while (read (fd[0], buf, 1) > 0)
    {
        std::cout << "Read" << std::endl;
        res += buf;
        if (res.find ("score") != std::string::npos)
        {
            std::cout << "KILL" << std::endl;
            kill (pid, SIGKILL);
        }
    }
    close (fd[0]);
}
return 0;
4

1 に答える 1

1

setbuf(stdout, NULL)直前に電話してくださいexecl()。stdoutをバッファなしにします。

于 2013-01-31T12:15:04.417 に答える