我必须检查Linux系统信息。我可以在C中执行系统命令,但这样做我为每个命令创建一个新进程,这非常昂贵。我想知道是否有办法获取系统信息而不必强制执行shell命令。我一直在四处寻找,但我一无所获。实际上,我甚至不确定通过Bash从我的C程序调用它们来执行命令是否更方便,或者找到一种方法来仅使用C来完成任务。
答案 0 :(得分:3)
Linux在/proc
下公开了批次信息。你可以从那里读取数据。例如,fopen
/proc/cpuinfo
处的文件并阅读其内容。
答案 1 :(得分:1)
可能不太知道(和更复杂的)方法,你也可以使用api接口sysctl
。要在Linux下使用它,您需要#include <unistd.h>
,#include <linux/sysctl.h>
。 A code example of that is available in the man page:
#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);
}
但是,链接的手册页也注明:
Glibc不为此系统调用提供包装器;用它来称呼它 系统调用(2)。或者更确切地说......不要叫它:使用这个系统调用了 长期以来一直表示气馁,而且它很可能不受欢迎 在未来的内核版本中消失。从Linux 2.6.24开始,使用此 系统调用导致内核日志中的警告。从你的。删除它 程序现在;改为使用/ proc / sys接口。
只有在配置了内核时,此系统调用才可用 CONFIG_SYSCTL_SYSCALL选项。
请注意,您可以使用sysctl()
执行任何操作,也可以read()
/proc/sys
{{1}}。 另请注意,我确实理解该系统调用的有用性值得怀疑,我只是将其放在此处以供参考。
答案 2 :(得分:0)
您还可以使用sys/utsname.h
头文件来获取内核版本,主机名,操作系统,机器硬件名称等。有关sys/utsname.h
的更多信息是here。这是获取当前内核版本的示例。
#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