- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我项目的某个地方,我使用 fork 和 pipe 来执行另一个进程并通过管道传输它的 I/O 以与其通信(我用 C++ 编写它)。当我在 Ubuntu 14.04 中编译它时没有问题,它会工作得很好,但是我在 WMWare 虚拟机上的 fedora 中编译它并且奇怪的事情开始发生。如果我在终端中运行二进制文件,没有错误,但管道中不会写入任何内容(但获取字符流会起作用)。我试图在 fedora 中调试我的代码,我在我的代码中放置了一个断点,但是当进程试图从管道读取时给出了一个损坏的管道信号(在终端中执行时没有信号)。那么,你们以前遇到过这样的问题吗? debian 和 red hat linux 之间的管道有什么区别吗?还是因为我在虚拟机上运行 fedora?
代码:
int mFD_p2c [2];
int mFD_c2p [2];
int mEnginePID;
if (pipe(mFD_p2c) != 0 || pipe(mFD_c2p) != 0)
{
cout << "Failed to pipe";
exit(1);
}
mEnginePID = fork();
if (mEnginePID < 0)
{
cout << "Fork failed";
exit(-1);
}
else if (mEnginePID == 0)
{
if (dup2(mFD_p2c[0], 0) != 0 ||
close(mFD_p2c[0]) != 0 ||
close(mFD_p2c[1]) != 0)
{
cout << "Child: failed to set up standard input";
exit(1);
}
if (dup2(mFD_c2p[1], 1) != 1 ||
close(mFD_c2p[1]) != 0 ||
close(mFD_c2p[0]) != 0)
{
cout << "Child: failed to set up standard output";
exit(1);
}
string engine = "stockfish";
execlp(engine.c_str(), (char *) 0);
cout << "Failed to execute " << engine;
exit(1);
}
else
{
close(mFD_p2c[0]);
close(mFD_c2p[1]);
string str = "uci";
int nbytes = str.length();
if (write(mFD_p2c[1], str.c_str(), nbytes) != nbytes)
{
cout << "Parent: short write to child";
exit(1);
}
cout << "The following string has been written to engine:\n"
<< string(1, '\t') << str;
char readBuffer[2];
string output = "";
while (1)
{
int bytes_read = read(mFD_c2p[0], readBuffer, sizeof(char));
if (readBuffer[0] == '\n')
break;
readBuffer[bytes_read] = '\0';
output += readBuffer;
}
cout << "Got: " << output;
}
最佳答案
我看到您正在使用 Stockfish。我也确实经历过 Stockfish 的这种行为。问题在于它如何处理输出。在misc.h
中定义:
#define sync_cout std::cout << IO_LOCK
再次查看代码,我们将看到 IO_LOCK
是一个枚举,用于 cout 的重载友元运算符:
std::ostream& operator<<(std::ostream& os, SyncCout sc) {
static Mutex m;
if (sc == IO_LOCK)
m.lock();
if (sc == IO_UNLOCK)
m.unlock();
return os;
}
我在这里看到的是,在使用 cout 期间,互斥体被锁定。我不知道这究竟如何影响 cout 在管道而不是 stdout 中的输出,但我肯定这是问题的原因。您可以通过删除锁定功能来检查它。
编辑:我忘了提到管道行为在基于 linux 的系统中并没有像前面提到的那样不同,但是在处理与管道一起使用的互斥量的发行版之间可能存在细微差别。
关于c++ - piping stockfish 在 fedora 中行为不端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30257108/
我有一个 FEN位置,我想分析哪个位置更强。 例如,我有这个职位 rnbq1bnr/pp2k2N/8/2p1p2Q/4N3/8/PPPP1PPP/R1B1KB1R b KQ - 0 1 如何使用 St
我已经用PYTHON写了一个国际象棋软件,它通过这个库使用了斯托克菲什:https://pypi.org/project/stockfish/。该软件运行良好,运行良好。太好了,实际上是…。我的想法是
在我项目的某个地方,我使用 fork 和 pipe 来执行另一个进程并通过管道传输它的 I/O 以与其通信(我用 C++ 编写它)。当我在 Ubuntu 14.04 中编译它时没有问题,它会工作得很好
我正在尝试研究如何将 stockfish(或任何 UCI 兼容引擎)集成到我的 Android 应用程序中。 我从这里下载了 stockfish Android zip: Download Stock
早上好。我正在尝试将 Stockfish 实现到 Unity 国际象棋游戏中,有人告诉我最好的方法是使用 Spawn.Process有谁知道我可以查看并作为引用的现有代码? 不同的游戏状态是与 AI
早上好。我正在尝试将 Stockfish 实现到 Unity 国际象棋游戏中,有人告诉我最好的方法是使用 Spawn.Process有谁知道我可以查看并作为引用的现有代码? 不同的游戏状态是与 AI
我想在我的网站上为我的学生制作一个国际象棋拼图。我使用 stockfish.js 来玩这个引擎。如何更改棋盘上的起始位置?我尝试更改所有 FEN 字符串但没有用。在哪里寻找功能或其他东西?有谁能帮帮我
我编写了一个具有非常漂亮的 GUI 的国际象棋程序 (PyQt5)。当我输入一个 Action 时,它会对其进行分析并更新棋盘的 SVG 表示形式 - 这要归功于出色的 python-chess 模块
我正在尝试编写一个通过命令行与 Stockfish 国际象棋引擎交互的程序。我研究过使用管道和重定向 cin/cout,但问题是 Stockfish 运行它自己的 shell 而不是只给出单行输出,例
自 Stockfish是评价最高的国际象棋引擎,众所周知它非常高效,我决定打开它的源代码并尝试了解它是如何工作的。 我遇到了这段代码,只需将位板移动到某个方向(北、南、东...) 取自 STOCKFI
我正在尝试将 Stockfish Chess Engine 与一个用 Swift 编写的应用集成。 Stockfish iOS 源代码对所有人开放,但它是用 Objective-C 编写的,引擎是用
目标是一个 Angular 应用程序,它可以在浏览器中运行并与国际象棋引擎对战。我想将 Stockfish.js 作为 Web Worker 运行。当使用指向 stockfish.js 文件的 uri
我是一名优秀的程序员,十分优秀!