我正在尝试编写一个程序,通过命令行与Stockfish国际象棋引擎接口。我已经研究过使用管道和重定向cin/cout,但问题是Stockfish运行自己的shell,而不是只提供一行输出,例如:
~$ stockfish
Stockfish 261014 64 by Tord Romstad, Marco Costalba and Joona Kiiski
> go movetime 5000
[output]
...
> quit
~$我尝试了以下代码(来自here)来读取执行命令并将它们读取回来,但当我试图运行Stockfish并打印输出时,它从未完成:
#include <string>
#include <iostream>
#include <stdio.h>
std::string exec(char* cmd) {
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[128];
std::string result = "";
while(!feof(pipe)) {
if(fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
pclose(pipe);
return result;
}
int main(void)
{
std::cout << exec("ls") << std::endl; // this works fine
std::cout << exec("stockfish") << std::endl; // this never ends
return 0;
}我的问题是,为什么这不起作用,我如何才能编写一个程序来发送和接收来自Stockfish shell的文本?
发布于 2015-08-30 22:22:35
只有在管道上检测到EOF时,才能完成while循环,这在popen'd命令终止之前是不会发生的。它在等待输入的事实本质上是无法察觉的。
因为popen只重定向了stdout,所以波芬会与您的程序共享stdin。当您启动河豚时,它将尝试读取输入。如果你不打字,什么事都不会发生。
因此,您应该尝试将希望它执行的命令发送给斯托克鱼,并以“退出”命令结尾。
Popen只允许您发送或接收数据,具体取决于操作数的模式。你不能两者兼得。您可以使用通常的fork和exec技术,也可以使用stockfish < sfcmds.txt之类的技术。
https://stackoverflow.com/questions/32301415
复制相似问题