IO文件描述符

时间:2015-03-04 11:08:46

标签: c++ linux file ifstream file-descriptor

我刚刚遇到以下行为,并想知道其背后的原因:

假设像这样的简化程序

...
{
  std::ifstream in(argv[1]);
  assert(in.good());
  while (std::getline(in, line)) {
   // Area 1
  }
  in.close();
}
{
  std::ifstream in(argv[1]);
  assert(in.good());
  while (std::getline(in, line)) {
   // Area 2
  }
  in.close();
}

如果像这样调用这样的程序:

./myProg xxx

两者,区域1和区域2将被输入n次,其中n是xxx中的行数。

然而,如果我这样称呼(使用bash):

./myProg <(head -n 100 xxx)

区域1 将输入 100 次,区域2 将输入 0 次。两个断言(in.good())都通过了。显然第二个传递一个文件描述符(如果我打印参数,如/ dev / fd / 63)而不是实际文件,这个东西可以打开一次读取 - 但是当打开两次时,它似乎是空的第二次电话。

我想知道背后的原因是什么。

1 个答案:

答案 0 :(得分:2)

head进程由bash执行一次,并将其输出重定向到您的进程可以通过该文件inode访问的管道。您的程序对head命令一无所知,并且尝试关闭并重新打开该文件不会导致它再次执行。

它类似于您的程序从cin读取并将其作为head -n 100 xxx | ./myProg执行时的情况。在那种情况下,您不希望能够通过cin两次读取数据。这是一样的。