我有一个客户端和服务器通过标准输入/标准输出进行通信。这工作得很好: mkfifo fifo0 client < fifo0 | server > fifo0
两个客户和服务器基本上是这样的:fstream与iostream和mkfifo
int main() {
run(cin, cout);
return 0;
}
现在我想调试服务器。因此,在两个不同的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;
}
会有人请解释为什么解决了这个问题?
你在一起运行它们吗? – littleadv
我并不完全遵循你正在做的事情,但我怀疑你正在运行正常的FIFO语义,即打开将阻塞,直到另一侧有读写器。由于shell会将它们重定向到您,因此直到您自行完成之后才会引起注意。 – Duck
我已将问题简化为我确定的内容。这个更简单的问题更清楚吗? @littleadv:是的,同时在2个不同的终端。 – cdunn2001