正确的阅读方式/ proc / pid / status

时间:2016-08-11 08:11:03

标签: c++ linux string std procfs

我用这种方式阅读/proc/<pid>/status

std::ifstream file(filename);
std::string line;
int numberOfLinesToRead = 4;
int linesRead = 0;

while (std::getline(file, line)) {
    // do stuff
    if (numberOfLinesToRead == ++linesRead) {
        break;
    }
}

我注意到在极少数情况下std::getline会挂起。

  1. 为什么会这样?我觉得proc文件系统应该处于一定的一致状态,并且不应该出现缺少换行的情况。我的假设是当发生EOF /错误时getline返回false
  2. 推荐使用安全方式阅读/proc/<pid>/status的方式是什么?

2 个答案:

答案 0 :(得分:0)

也许更有把握的途径是将fread用于大缓冲区。状态文件很小,因此请分配本地缓冲区并读取整个文件。

Example查看最简单解决方案的第二个答案

这可能仍然会对fopen或fread失败,但应该返回合理的错误。

答案 1 :(得分:-2)

/proc is a virtual filesystem。这意味着从&#34;文件&#34;在它中与从普通文件系统读取不同。

如果进程退出,则有关它的信息会从/ proc中删除的速度比真正的文件系统快(这里涉及脏缓存刷新延迟)。

请记住,在您阅读尚未缓冲的下一行之前,该流程会退出。

解决方案要么考虑文件丢失,因为您可能不需要有关不再存在的进程的信息,要么缓冲整个文件,然后只解析它。

编辑:进程中的挂起应该与这是虚拟文件系统这一事实有关。它的行为与真实文件系统的行为完全不同。由于这是特定的fs类型,因此问题可能出在fs驱动程序中。您提供的代码看起来很适合正常的文件读取。

相关问题