我需要读取二进制文件(fceux,nes模拟器)标准输出以获取一些信息,并在我收到我正在尝试的遗传算法的特殊输入时将其删除。所以基本上,问题是程序没有刷新他的输出,所以我只在进程结束时收到输出,但它永远不会结束,因为我想要杀死它。
那么有没有办法从未刷新的缓冲区子读取?即使它不是在C ++中,所以我可以添加一些flush,然后在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;
答案 0 :(得分:1)
在setbuf(stdout, NULL)
之前致电execl()
。它使stdout无缓冲。