【问题标题】:get basic hardware information using C/C++/Java使用 C/C++/Java 获取基本硬件信息
【发布时间】:2011-03-09 22:14:39
【问题描述】:

我正在尝试阅读有关设备(在 Solaris 机器中)的一些基本信息,例如没有。 CPU,没有。硬盘驱动器,没有。网络适​​配器等...

据我了解,我们无法直接从 Java 获取这些信息。 (如果我错了,请纠正我)。

因此,解决方法是调用 JNI 调用。

现在,我如何在 C/C++ 中编写代码? C 中是否有任何现有的系统调用/方法来获取这些信息?

我试图避免在 C 中使用 system() 方法,因为我想将信息存储为字符串。

我知道有一些 shell 命令,如 iostat、kstat、ifconfig 等……但是如何在我的 C/C++ 程序中模拟它们?

谢谢,

【问题讨论】:

  • >> 据我了解,我们无法直接从 Java 获取这些信息。您始终可以调用系统/shell 程序并捕获输出。这也适用于 Java。
  • 同意以上。除非您只是在寻找学习 JNI 的借口,否则只需调用现有的系统命令并捕获输出就会容易得多。
  • 您可以从System.getProperty() 获得一些非常基本的信息,例如os.arch、os.name - 这可以帮助您选择要调用的正确shell 程序(或要读取的正确文件)。
  • @Alexander:如何在 Java 中捕获系统调用?
  • @Brian:我对 JNI 有一些经验。我的问题是如何在 C/C++ 中捕获系统命令的输出?使用 system() 命令打印到标准输出。

标签: java c hardware solaris device


【解决方案1】:

/proc filesystem 有很多信息供您解析。 iostat 例如读取 /proc/diskstats。那里还有很多,大多数 linux 实用程序只是从这里读取信息。

至少,如果您使用 linux 或 solaris,您甚至不需要 JNI 来获取所有信息。

【讨论】:

  • 不适用于 /proc 严格用于进程信息而非系统的 Solaris。
  • 好吧,但是在 /sysfs 中也提供了相同的信息,只是结构不同。
  • 恐怕 sysfs 仍然是 Linux 特有的东西,不适用于 Solaris。
  • 该死的:)。我总是看不起那些只知道 windows 的人,但我知道我也觉得很傻 :)。很抱歉给了一个无用的答案。
【解决方案2】:

对于 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() 的应用程序使用的内存一样多的内存。根据this answer,这是因为 fork() 在 fork 子进程时复制了父进程。这对于使用大量内存的应用程序来说可能是个问题。

【讨论】:

  • 我认为大多数内核都实现了写时复制。他们甚至可以在fork+exec 案例中应用进一步的优化。所以应该不是内存问题。除此之外,我认为这是最直接的解决方案。
  • 这在 Solaris 上无法正常工作(我的意思是“cat cpuinfo”)。
  • @jlliagre - 是的,我的示例只是说明您将如何进行系统调用;我只是将cat /proc/cpuinfo 放在那里作为示例 - 它显然必须根据环境和可用的系统文件/命令进行更改。
【解决方案3】:

在 JNI 中编码(绑定到 C)

  1. 编写 Java 类,至少包含 一种标记为“本机”的方法。
  2. 使用javac编译“.java” 文件到“.class”文件
  3. 使用javah 工具提取C /C++ 兼容头文件来自 编译后的“.class”文件。
  4. 为 提取的所有方法 头文件,并将它们编译成一个 共享对象库 (.so for unix / linux,.dll 用于 Windows)。
  5. 修改原java源码 静态加载共享对象 任何实例之前的库 已创建。

关于如何获得所需数据,请参阅任意数量的 Windows 或 UNIX 系统编程参考资料。如果针对 Linux 平台,大多数工具都是开源的,因此您可以查看源代码以确定工具如何获取其数据(假设您可以忍受此类任务可能对您的代码施加的许可限制) .

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 2011-05-14
    • 2010-10-28
    • 2011-05-11
    • 2011-09-19
    • 2010-11-12
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多