繁体   English   中英

fstream与iostream和mkfifo

[英]fstream vs. iostream and mkfifo

我有一个客户端和一个服务器 ,它们通过stdin / stdout进行通信。 可以正常工作: mkfifo fifo0 client < fifo0 | server > fifo0 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;
}

谁能解释为什么能解决这个问题?

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

由于您可能使用的是Linux,所以这来自fifo手册页:“在Linux下,打开FIFO进行读写将在阻塞和非阻塞模式下都成功。POSIX对此行为未定义。可用于为以下对象打开FIFO:在没有读者的情况下写作。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM