Linux С++: файлы apis vs/proc?

Im работает над приложением, чтобы собирать и отправлять различные биты информации о системе (свободное место/бесплатно, информация об аккумуляторах ноутбука и т.д.). Я не имел большого успеха, получая эту информацию в виде прямого С++ api.. хотя его все доступно через файлы в /proc (или аналогичные).

Итак - мне интересно, является ли чтение/разбор этих файлов в моем приложении на С++ подходящим способом получения этой информации или я должен продолжать искать API? (ПРИМЕЧАНИЕ: я работаю с statvfs).

До сих пор, похоже, было проще собрать такую ​​информацию в Win32. Кажется странным.

Ответ 1

Лучше всего придерживаться API в следующем порядке приоритета.

  • Ваш языковой API (для вас это не очень помогает, но для строк лучше использовать строчную функцию C99, чем средство библиотеки, указанное в стандарте Posix или другой ОС.)

  • API-интерфейс программного обеспечения Posix

  • Документированный API ядра API

  • Недокументированные API-интерфейсы ядра (по крайней мере, они сломают, скажем, пользователей ioctl, если они меняются, поэтому они, вероятно, не изменятся)

  • /proc

  • /dev/kmem, /dev/mem

Нет причин полагать, что троллирование /proc будет переносимым или даже тем же от выпуска до выпуска. Не каждая система даже имеет установленный /proc!

Сказав все это, гораздо проще просто очистить материал от /proc, и если это единственный доступный интерфейс, тогда вы должны пойти дальше и использовать it.qa

Наконец, порядок двух последних не совсем ясен, потому что /proc недоступен для анализа дампа ядра после вскрытия, но инструменты, которые могут заглянуть в дамп ядра, по-прежнему будут работать.

Ответ 2

Я, хотя /proc был API (все файлы...)

Ответ 3

Как вы заметили, много информации о системах Linux находится в /proc. И вы правы, что часто нет API-интерфейса C для извлечения этой информации (хотя обычно есть команда оболочки, если вы склонны придерживаться bash вместо С++). В худшем случае вы можете занять парсинг через /proc, хотя вы можете получить некоторый пример кода в виде команд оболочки с открытым исходным кодом для конкретного элемента, который вы хотите.