我这样读取/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; } }
我注意到,在极less数情况下, std::getline
挂起。
getline
返回false
。 /proc/<pid>/status
? 也许更确定的路径是使用fread到一个大的缓冲区。 状态文件很小,因此分配一个本地缓冲区并读取整个文件。
示例查看最简单解决方案的第二个答案
这可能仍然会失败,但应该返回一个明智的错误。
/ proc是一个虚拟文件系统 。 这意味着从“文件”中读取与从普通文件系统读取不同。
如果进程退出有关它的信息被从/ proc删除比如果它是真正的文件系统(这里涉及脏缓存刷新延迟)。
考虑到这一点,在你读下一行还没有被缓存的行之前,想象这个过程会退出。
解决办法是解决文件丢失,因为您可能不需要关于不再存在的进程的信息,或缓冲整个文件,然后只解析它。
编辑:在过程中挂起应明确与这是虚拟文件系统的事实有关。 它不像真正的文件系统一样。 由于这是特定的FS类型的问题可能是在FS驱动程序。 您提供的代码对于正常的文件读取看起来很不错。