文件描述符上的IO

IO on file descriptors

本文关键字:IO 描述 文件      更新时间:2023-10-16

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

假设一个类似的简化程序

...
{
  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多次。两个断言(在.good()中)都通过了。第二个断言似乎传递了一个文件描述符(如果我打印参数,则类似于/dev/fd/63),而不是一个实际的文件,并且这个东西可以打开读取一次,但当打开两次时,第二个调用似乎为空。

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

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

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