【发布时间】:2016-12-17 20:43:21
【问题描述】:
我是这样读/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 挂起。
- 为什么会这样?我的印象是 proc 文件系统应该处于某种一致的状态,并且不应该出现缺少换行符的情况。我的假设是
getline在发生 EOF/错误时返回false。 - 推荐的安全阅读方式是什么
/proc/<pid>/status?
【问题讨论】:
-
这是逐行准备任何文本文件的“正确”方式。但是,如果您正在检查的进程在您读取文件时退出,那么与读取其他文本文件相比,行为可能会有所不同。并且没有
std::getline不返回布尔值,它返回流which can be used in a boolean expression。 -
关于第二个问题,从
/proc/<some pid other than your own>/读取任何文件确实没有安全的方法,因为其他进程可能随时退出。您可能需要使用其他一些特定于 Linux 的系统调用来获取进程的状态,最好是在内核写入结构的直接系统调用中,而不是使用标准 C++ 库从文件中读取。 -
我很惊讶这应该挂起。我怀疑这可能是编译器中的一个错误,也可能是
OS中的一个错误,因为如果另一个进程从您下面删除了一个文件,那么这应该会在您的文件描述符中干净地生成一个错误。而/proc的行为应该与任何其他文件一样。你确定那个exact代码会导致他的错误吗? -
@Galik 是的,非常确定。由gdb附加,检查回溯,继续执行,再次检查回溯。这里是:gist.github.com/lstipakov/95e6091d53e8f779c14800e6309109c0
-
@lstipakov,当你的程序挂起时,
strace的输出是什么?
标签: c++ linux string std procfs