在C语言中获取Linux系统信息

4

我需要检查Linux系统信息。我可以在C中执行系统命令,但这样做会为每个命令创建一个新进程,这是非常昂贵的。我想知道是否有一种方法可以在不强制执行shell命令的情况下获取系统信息。我已经找了一段时间,但没有找到任何东西。实际上,我甚至不确定通过从我的C程序调用Bash来执行命令是否更方便,还是找到一种只使用C就能完成任务的方法。


除非你在循环中运行这些shell命令,否则它们并不是那么昂贵的。 - Tom van der Woerdt
7
什么系统信息? - Oliver Charlesworth
我需要关于活动进程、内存和磁盘使用情况等信息。我需要经常获取这些信息,例如每10或30分钟一次,而不会对系统产生太大影响! - user3574984
@user3574984 每10分钟运行ps axwww不会有显著影响。这确实使代码变得更加简单。 - Tom van der Woerdt
3个回答

7

Linux系统在/proc目录下提供了大量的信息。你可以从那里读取数据。例如,使用fopen函数打开/proc/cpuinfo文件并读取其内容。


3

除了较为简单的方法外,还有一种可能不太被人知晓、更为复杂的方法,那就是你也可以使用 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);
}

然而,链接的man页面还指出:
Glibc没有为此系统调用提供包装器;请使用syscall(2)进行调用。或者......不要调用它:长期以来一直不建议使用此系统调用,并且它非常不受欢迎,因此很可能会在未来的内核版本中消失。自Linux 2.6.24以来,对此系统调用的使用会导致内核日志中的警告。现在就从您的程序中删除它;改用/proc/sys接口。
仅当内核配置了CONFIG_SYSCTL_SYSCALL选项时,才可以使用此系统调用。
请记住,您可以使用sysctl()执行的任何操作也可以从/proc/sys读取。同时请注意,我确实理解该系统调用的有用性值得怀疑,我只是将其放在这里供参考。

0

你也可以使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接