前一段时间,我已经为“吃水”游戏编写了一个引擎,现在我想编写一个程序,通过某种协议与其中两个引擎进行通信。最后,我希望拥有类似于UCI协议的东西,该协议在国际象棋引擎的程序员中广为人知。
引擎应该通过stdin接收所有命令,并通过stdout发送其响应。
我创建了一个虚拟引擎,以在if语句之前进行一些测试来测试此引擎,以查看引擎是否收到任何东西。
php -i | find /i "Configuration File
这是我尝试使用管道进行通信的部分
int main(){
std::cerr<<"MainEngine"<<std::endl;
while (!std::cin.eof()) {
std::string current;
std::getline(std::cin, current);
std::cerr<<"FromMain:"<<current<<std::endl;
if (current == "init") {
initialize();
std::cout << "ready" << "\n";
} else if (current == "hashSize") {
std::string hash;
std::getline(std::cin, hash);
setHashSize(1u << std::stoi(hash));
} else if (current == "position") {
std::string position;
std::getline(std::cin, position);
} else if (current == "move") {
std::string move;
std::getline(std::cin, move);
}
}
return 0
}
我正在为每个引擎创建两个子进程。在此测试中,我仅向每个引擎发送“ init \ n”,并期望子进程打印“ FromMain:init”。但是,我只能从其中一个子进程中获取输出“ MainEngine”。
这是我第一次尝试使用管道,但我不知道在哪里弄糟。对于如何正确设置通信部分的一些提示/帮助,我将不胜感激。
答案 0 :(得分:1)
close(enginePipe[i][1]);
dup2(enginePipe[i][1], STDOUT_FILENO);
您正在关闭管道,然后尝试将其复制。这不起作用。
close(enginePipe[i][0]);
close(mainPipe[i][1]);
std::string message = "init\n";
Interface inter{enginePipe[0][0], enginePipe[1][0], mainPipe[0][1], mainPipe[1][1]};
您正在关闭这些管道,然后也尝试使用它们。然后使inter
遍历所有管道,而不是只遍历一次。
我建议您先用两个进程和一个管道来做一些简单的事情,然后再用三个进程和四个管道来尝试类似的事情。