我需要检查Linux系统信息。我可以在C中执行系统命令,但这样做会为每个命令创建一个新进程,这是非常昂贵的。我想知道是否有一种方法可以在不强制执行shell命令的情况下获取系统信息。我已经找了一段时间,但没有找到任何东西。实际上,我甚至不确定通过从我的C程序调用Bash来执行命令是否更方便,还是找到一种只使用C就能完成任务的方法。
Linux系统在/proc
目录下提供了大量的信息。你可以从那里读取数据。例如,使用fopen
函数打开/proc/cpuinfo
文件并读取其内容。
除了较为简单的方法外,还有一种可能不太被人知晓、更为复杂的方法,那就是你也可以使用 sysctl
的 api 接口来实现。如果在 Linux 下使用它,你需要包含 #include <unistd.h>
和 #include <linux/sysctl.h>
。 在 man 页面上提供了一个代码示例:链接
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/sysctl.h>
int _sysctl(struct __sysctl_args *args );
#define OSNAMESZ 100
int
main(void)
{
struct __sysctl_args args;
char osname[OSNAMESZ];
size_t osnamelth;
int name[] = { CTL_KERN, KERN_OSTYPE };
memset(&args, 0, sizeof(struct __sysctl_args));
args.name = name;
args.nlen = sizeof(name)/sizeof(name[0]);
args.oldval = osname;
args.oldlenp = &osnamelth;
osnamelth = sizeof(osname);
if (syscall(SYS__sysctl, &args) == -1) {
perror("_sysctl");
exit(EXIT_FAILURE);
}
printf("This machine is running %*s\n", osnamelth, osname);
exit(EXIT_SUCCESS);
}
你也可以使用sys/utsname.h
头文件来获取内核版本、主机名、操作系统、机器硬件名称等信息。更多关于sys/utsname.h
的内容请参见这里。以下是获取当前内核版本的示例。
#include <stdio.h> // I/O
#include <sys/utsname.h>
int main(int argc, char const *argv[])
{
struct utsname buff;
printf("Kernel Release = %s\n", buff.release); // kernel release
return 0;
}
这与使用uname
命令相同。您还可以使用-a
选项,该选项代表所有信息。
uname -r # -r stands for kernel release
ps axwww
不会有显著影响。这确实使代码变得更加简单。 - Tom van der Woerdt