получить основную информацию об оборудовании с помощью C / C ++ / Java - PullRequest
0 голосов
/ 10 марта 2011

Я пытаюсь прочитать некоторую основную информацию об устройстве (в машине Solaris), как нет.процессоров нет.жестких дисков, нет.сетевых адаптеров и т. д. *

Насколько я понимаю, мы не можем получить эту информацию напрямую из Java.(Поправьте меня, если я ошибаюсь).

Итак, обходной путь заключается в вызове вызовов JNI.

Теперь, как мне это написать на C / C ++?Существует ли какой-либо системный вызов / метод в C для получения этой информации?

Я пытаюсь избежать использования метода system () в C, потому что я хочу сохранить информацию в виде строки.

Я знаю, что есть команды оболочки, такие как iostat, kstat, ifconfig и т. Д. Но как мне имитировать их в моей программе C / C ++?

Спасибо,

Ответы [ 3 ]

1 голос
/ 10 марта 2011

Файловая система / proc содержит много информации для анализа. например, иостат читает / proc / diskstats. Там намного больше, и большинство утилит linuxs просто читают информацию отсюда.

Вам даже не нужен JNI, чтобы получить всю информацию, по крайней мере, если вы остаетесь на Linux или Solaris.

1 голос
/ 10 марта 2011

Для решения Java альтернативой JNI будет использование Java Runtime.exec() для выполнения системных команд.Вот простой пример:

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("/bin/cat /proc/cpuinfo");
process.waitFor();

InputStream in = process.getInputStream();
// read stdout contents from InputStream and parse accordingly

Обратите внимание, что это имеет недостатки:

  • Это не зависит от платформы
  • Runtime.exec () имеет некоторые недостаткиразветвляет дочерний процесс для выполнения команды.В определенных средах он выделяет столько же памяти разветвленному процессу, сколько использует приложение, вызывающее Runtime.exec ().Согласно этому ответу , это потому, что fork () дублирует родительский процесс при разветвлении дочернего элемента.Это может быть проблематично для приложений, которые используют много памяти.
0 голосов
/ 10 марта 2011

Для кодирования этого в JNI (связан с C)

  1. Напишите класс Java, по крайней мере с одним методом, помеченным как "native".
  2. Используйте javac для компиляциифайл ".java" в файл ".class"
  3. Используйте инструмент javah для извлечения совместимого с C / C ++ заголовочного файла из скомпилированного файла ".class".
  4. Записьреализация C / C ++ для всех методов в извлеченном заголовочном файле и компилирование их в библиотеку общих объектов (.so для unix / linux, .dll для windows).
  5. Изменение исходного исходного кода Javaкод для статической загрузки библиотеки общих объектов перед созданием любых экземпляров.

Что касается того, как вы можете получить нужные данные, обратитесь к любому количеству ссылок на системное программирование для Windows или UNIX.При нацеливании на платформу Linux большинство инструментов имеют открытый исходный код, поэтому вы можете посмотреть на исходный код, чтобы определить, как инструменты получили свои данные (при условии, что вы можете жить с лицензионными ограничениями, которые такая задача может накладывать на ваш код).

...