【问题标题】:IO on file descriptors文件描述符上的 IO
【发布时间】:2015-03-04 11:08:46
【问题描述】:

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

假设一个这样的简化程序

...
{
  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)而不是一个实际的文件,并且这个东西可以打开以读取一次 - 但是当打开两次时,它似乎是空的第二次调用。

不知道是什么原因。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-11
      • 1970-01-01
      • 2014-04-25
      • 2012-10-09
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      相关资源
      最近更新 更多