I use execv to run lshw command to get the CPU, disk, and memory in C code. But I would like to search another solution to get these information from /proc or any other existed data. Have any suggestion? Here is my code:
char *params[9] = {"/usr/bin/lshw", "-short", "-c", "disk",
"-c", "memory", "-c", "processor", 0}; //cmd params filled
execv(params[0], params);
Linux command: $ sudo lshw -short -c disk -c processor -c memory
$ sudo lshw -short -c disk -c processor -c memory H/W path Device Class Description ====================================================== /0/0 memory 64KiB BIOS /0/22 memory 16GiB System Memory /0/22/0 memory DIMM Synchronous [empty] /0/22/1 memory DIMM Synchronous [empty] /0/22/2 memory 8GiB DIMM Synchronous 2133 MHz (0.5 ns) /0/22/3 memory 8GiB DIMM Synchronous 2133 MHz (0.5 ns) /0/2a memory 256KiB L1 cache /0/2b memory 1MiB L2 cache /0/2c memory 6MiB L3 cache /0/2d processor Intel(R) Xeon(R) CPU D-1521 @ 2.40GHz /0/1/0.0.0 /dev/sda disk 16GB SATADOM-SH 3IE3 /0/2/0.0.0 /dev/sdb disk 120GB Patriot Blaze
I have two questions:
- Where to find a guide to parse the files in
/procto get these hardware information? - Do I need to trace the source code of
lshwto find what doeslshwdo?
Edit:
Chapter 7 of Advanced Linux Programming is a guide to parse the /proc filesystem.
Advertisement
Answer
By reading the source code of lshw, I found that lshw read raw data from /sys/class/dmi/. Because lshw is written in CPP that I am not familiar with, there is a question Where does dmidecode get the SMBIOS table? mentioned that dmidecode.c read raw data from /sys/class/dmi that’s same as lshw does.
Here are the definitions in dmidecode.c
#define SYS_ENTRY_FILE "/sys/firmware/dmi/tables/smbios_entry_point" #define SYS_TABLE_FILE "/sys/firmware/dmi/tables/DMI"
I extract code from dmidecode.c to get the CPU and memory information, and use lsscsi to get disk information.
Thanks for your help.