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
, хотя вы можете получить некоторый пример кода в виде команд оболочки с открытым исходным кодом для конкретного элемента, который вы хотите.