我目前正尝试用C++中的Stockfish国际象棋引擎运行简单的测试,以获得最佳的可能走法。我将Stockfish作为子进程启动,并希望使用输入和输出流来传递所需的UCI命令,我正在通过管道与父进程交换这些命令。然而,当我运行代码时,Stockfish只是启动了,没有发生任何其他事情。然后在CLI中输入UCI命令就可以工作了,但这显然不是目标。我做错了什么?
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
void sig_handler(int sig) {}
int main() {
int fd1[2];
if (pipe(fd1) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
int pid = fork();
if (pid == 0) {
execl("./stockfish", "./stockfish", nullptr);
close(fd1[1]);
char position[60];
read(fd1[0], position, 60);
close(fd1[0]);
cout << "position " << position << endl;
cout << "go" << endl;
sleep(5000);
cout << "stop" << endl;
string move;
cin >> move;
exit(0);
}
else {
close(fd1[0]);
cout << "Parent process" << endl;
string line = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
write(fd1[1], line.c_str(), strlen(line.c_str()) + 1);
close(fd1[1]);
signal(SIGINT, &sig_handler);
wait(NULL);
cout << "Parent done" << endl;
}
return 0;
}
1条答案
按热度按时间8e2ybdfx1#
多亏了@TedLyngmo和一些关于Boost库的研究,它非常容易实现: