【问题标题】:Read from unflush binary [duplicate]从 unflush 二进制文件中读取 [重复]
【发布时间】:2013-01-31 11:41:08
【问题描述】:

可能重复:
bash: force exec’d process to have unbuffered stdout

我需要读取二进制文件的(fceux,nes 模拟器)标准输出来获取一些信息,并在我收到我正在尝试的遗传算法的特殊输入时终止它。所以基本上,问题是程序没有刷新他的输出,所以我只在进程结束时收到输出,但它永远不会结束,因为我想杀死它。

那么有没有办法从未刷新的缓冲区子项中读取?即使它不在 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;

【问题讨论】:

  • 我不认为有一种半便携的方式可以做到这一点。
  • 由于缓冲完全是在那个二进制文件(或它使用的库)中实现的,没有人对它是如何做到的有丝毫的了解,当时唯一理智的答案是:不。该文件可以使用其内存的任何区域来存储其输出,然后再将其传递给某个 i/o 系统调用。
  • 关注@unwind 的链接并尝试取消缓冲,这正是我想要的方式。非常感谢为我节省了很多时间!

标签: c++ buffer pipe


【解决方案1】:

execl() 之前致电setbuf(stdout, NULL)。它使标准输出无缓冲。

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2018-08-24
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多