在C中获取Linux系统信息

时间:2014-04-27 12:32:30

标签: c linux bash

我必须检查Linux系统信息。我可以在C中执行系统命令,但这样做我为每个命令创建一个新进程,这非常昂贵。我想知道是否有办法获取系统信息而不必强制执行shell命令。我一直在四处寻找,但我一无所获。实际上,我甚至不确定通过Bash从我的C程序调用它们来执行命令是否更方便,或者找到一种方法来仅使用C来完成任务。

3 个答案:

答案 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