【问题标题】:Get Linux system information in C在 C 中获取 Linux 系统信息
【发布时间】:2014-06-12 22:59:02
【问题描述】:

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

【问题讨论】:

  • 除非你循环运行这些shell命令,否则它们真的没那么贵。
  • 什么系统信息?
  • 我需要有关活动进程、内存和磁盘使用情况等的信息。我必须经常获取这些信息,例如每 10 或 30 分钟一次,而不会对系统造成太大影响!
  • @user3574984 每 10 分钟运行一次 ps axwww 没有显着影响。它确实使代码更容易

标签: c linux bash


【解决方案1】:

Linux 在/proc 下公开了大量 信息。您可以从那里读取数据。例如,fopen/proc/cpuinfo 的文件并读取其内容。

【讨论】:

    【解决方案2】:

    一种可能鲜为人知(而且更复杂)的方法是,您也可以使用sysctl 的 api 接口。在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() 执行任何操作,也可以只使用/proc/sys 中的read()另外请注意,我确实理解该系统调用的有用性值得怀疑我只是将其放在这里以供参考

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-07
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 2017-11-07
        相关资源
        最近更新 更多