C++ 文件描述符上的IO

C++ 文件描述符上的IO,c++,linux,file,ifstream,file-descriptor,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)) { //

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

假设这样一个简化的程序

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

这与您的程序从
cin
读取并以
head-n100xxx./myProg
的形式执行时的情况类似。在这种情况下,您不希望能够通过
cin
读取两次数据。这是一样的

./myProg <(head -n 100 xxx)