分支/管道并运行多个程序

时间:2019-10-25 22:15:00

标签: c++ c

前一段时间,我已经为“吃水”游戏编写了一个引擎,现在我想编写一个程序,通过某种协议与其中两个引擎进行通信。最后,我希望拥有类似于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”。

这是我第一次尝试使用管道,但我不知道在哪里弄糟。对于如何正确设置通信部分的一些提示/帮助,我将不胜感激。

1 个答案:

答案 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遍历所有管道,而不是只遍历一次。

我建议您先用两个进程和一个管道来做一些简单的事情,然后再用三个进程和四个管道来尝试类似的事情。

相关问题