我有客户端和服务器,它们通过stdin / stdout进行通信。这很好用:
mkfifo fifo0
client < fifo0 | server > fifo0
客户端和服务器基本上都是这样的:
int main() {
run(cin, cout);
return 0;
}
现在我想调试服务器。所以在2个不同的shell中我想这样做:
gdb --args server fifo1 fifo0
还有这个:
client fifo0 fifo1
我改变main
以获取文件名参数。不幸的是,服务器停滞不前。使用 gdb ,我看到它在ifstream
构造函数中停顿,在这里:
int main(int argc, char** argv) {
char const fin[] = "fifo1";
cerr << "in: '" << fin << "'\n";
ifstream sin(fin);
cerr << "opened\n";
char const fout[] = "fifo0";
cerr << "out: '" << fout << "'\n";
ofstream sout(fout, ofstream::out | ofstream::app);
cerr << "opened\n";
run(sin, sout);
return 0;
}
为什么输出流为ofstream("fifo0")
时行为会有所不同?任何解决方案?
现在我可以在输入fifo之前打开输出fifo,如下所示:
int main(int argc, char** argv) {
char const fout[] = "fifo0";
cerr << "out: '" << fout << "'\n";
ofstream sout(fout, ofstream::out | ofstream::app);
cerr << "opened\n";
char const fin[] = "fifo1";
cerr << "in: '" << fin << "'\n";
ifstream sin(fin);
cerr << "opened\n";
run(sin, sout);
return 0;
}
有人请解释为什么解决了这个问题吗?
答案 0 :(得分:0)
@Duck:你是对的。打开FIFO块,直到每侧都有东西。在使用重定向(| < >
)时,shell通常会处理该细节。
答案 1 :(得分:0)
由于您可能正在使用Linux,因此它来自fifo手册页: &#34;在Linux下,打开FIFO进行读写将在阻塞和非阻塞模式下成功。 POSIX未定义此行为。这可以用来打开FIFO进行写入,而没有可用的读卡器。&#34;