Правильный способ чтения / proc / pid / status

Я читаю /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 должна быть в несколько непротиворечивом состоянии, и не должно быть случаев, когда перевод строки отсутствует. Мое предположение было то, что getline возвращается false когда происходит EOF / ошибка.
  2. Что рекомендуется, безопасный способ читать /proc/<pid>/status ?

5

Решение

Возможно, более верный путь — использовать fread в большой буфер. Файл состояния маленький, поэтому выделите локальный буфер и прочитайте весь файл.

пример посмотрите на второй ответ для самого простого решения

Это может все еще не работать на fopen или fread, но должна быть возвращена разумная ошибка.

0

Другие решения

/ proc — это виртуальная файловая система. Это означает, что чтение из «файлов» в нем отличается от чтения из обычной файловой системы.

Если процесс завершает работу, информация о нем удаляется из / proc гораздо быстрее, чем если бы это была настоящая файловая система (здесь используется задержка очистки грязного кэша).

Имея это в виду, представьте, что процесс завершается, прежде чем вы начнете читать следующую строку, которая еще не была буферизована.

Решением является либо учет потери файла, поскольку вам может не потребоваться информация о процессе, которого больше не существует, либо буферизация всего файла, а затем только его анализ.

РЕДАКТИРОВАТЬ: процесс зависания должен быть явно связан с тем, что это виртуальная файловая система. Он не ведет себя точно так же, как настоящая файловая система. Поскольку это специфический тип fs, проблема может быть в драйвере fs. Код, который вы предоставляете, выглядит нормально для обычного чтения файлов.

-2

По вопросам рекламы [email protected]