使用C / C ++ / Java获取基本硬件信息

时间:2011-03-09 22:14:40

标签: java c hardware solaris device

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

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

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

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

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

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

谢谢,

3 个答案:

答案 0 :(得分:1)

/proc filesystem有很多信息供您解析。例如,iostat读/ proc / diskstats。那里有更多,而且大多数linuxs utilitiy程序只是从这里读取信息。

至少,如果你留在linux或solaris上,你甚至不需要JNI来获取所有信息。

答案 1 :(得分:1)

对于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()的应用程序一样多的内存。根据{{​​3}},这是因为fork()在分叉子进程时复制了父进程。对于使用大量内存的应用程序,这可能会有问题。

答案 2 :(得分:0)

在JNI中编码(绑定到C)

  1. 至少写一个Java类 一种标记为“原生”的方法。
  2. 使用javac编译“.java” 将文件转换为“.class”文件
  3. 使用javah工具提取C 来自/ C ++兼容的头文件 已编译的“.class”文件。
  4. 编写C / C ++实现 提取的所有方法 头文件,并将它们编译成一个 共享对象库(.so for unix / linux,.dll for windows)。
  5. 修改原始java源代码 静态加载共享对象 在任何实例之前的库 创建。
  6. 至于如何获取所需数据,请参阅Windows或UNIX的任意数量的系统编程参考。如果针对Linux平台,大多数工具都是开源的,因此您可以查看源代码以确定工具如何获取其数据(假设您可以接受此类任务可能对您的代码施加的许可限制)