Я читаю /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
висит.
getline
возвращается false
когда происходит EOF / ошибка./proc/<pid>/status
? Возможно, более верный путь — использовать fread в большой буфер. Файл состояния маленький, поэтому выделите локальный буфер и прочитайте весь файл.
пример посмотрите на второй ответ для самого простого решения
Это может все еще не работать на fopen или fread, но должна быть возвращена разумная ошибка.
/ proc — это виртуальная файловая система. Это означает, что чтение из «файлов» в нем отличается от чтения из обычной файловой системы.
Если процесс завершает работу, информация о нем удаляется из / proc гораздо быстрее, чем если бы это была настоящая файловая система (здесь используется задержка очистки грязного кэша).
Имея это в виду, представьте, что процесс завершается, прежде чем вы начнете читать следующую строку, которая еще не была буферизована.
Решением является либо учет потери файла, поскольку вам может не потребоваться информация о процессе, которого больше не существует, либо буферизация всего файла, а затем только его анализ.
РЕДАКТИРОВАТЬ: процесс зависания должен быть явно связан с тем, что это виртуальная файловая система. Он не ведет себя точно так же, как настоящая файловая система. Поскольку это специфический тип fs, проблема может быть в драйвере fs. Код, который вы предоставляете, выглядит нормально для обычного чтения файлов.