fstream vs. iostream和mkfifo

时间:2014-03-02 04:30:17

标签: c++ fstream fifo

我有客户端服务器,它们通过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;
}

有人请解释为什么解决了这个问题吗?

2 个答案:

答案 0 :(得分:0)

@Duck:你是对的。打开FIFO块,直到每侧都有东西。在使用重定向(| < >)时,shell通常会处理该细节。

答案 1 :(得分:0)

由于您可能正在使用Linux,因此它来自fifo手册页: &#34;在Linux下,打开FIFO进行读写将在阻塞和非阻塞模式下成功。 POSIX未定义此行为。这可以用来打开FIFO进行写入,而没有可用的读卡器。&#34;