代码之家  ›  专栏  ›  技术社区  ›  Stéphane

我应该调用什么API来获得系统正常运行时间?

  •  27
  • Stéphane  · 技术社区  · 17 年前

    我想从运行在基于Linux的系统上的C应用程序中获得系统正常运行时间。我不想调用uptime(1)并解析输出,我想调用我怀疑存在的底层C API。有人知道是否有这样的调用,或者运行时间(1)只是处理从WTMP获得的记录吗?

    5 回复  |  直到 10 年前
        1
  •  36
  •   Kyle Smith    17 年前

    您要查找的系统调用是sysinfo()。

    它在sys/sysinfo.h中定义

    其签名为: int sysinfo(结构sysinfo*信息)

    自内核2.4以来,结构如下:

    struct sysinfo {
        long uptime;             /* Seconds since boot */
        unsigned long loads[3];  /* 1, 5, and 15 minute load averages */
        unsigned long totalram;  /* Total usable main memory size */
        unsigned long freeram;   /* Available memory size */
        unsigned long sharedram; /* Amount of shared memory */
        unsigned long bufferram; /* Memory used by buffers */
        unsigned long totalswap; /* Total swap space size */
        unsigned long freeswap;  /* swap space still available */
        unsigned short procs;    /* Number of current processes */
        unsigned long totalhigh; /* Total high memory size */
        unsigned long freehigh;  /* Available high memory size */
        unsigned int mem_unit;   /* Memory unit size in bytes */
        char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */
    };
    

    玩得高兴!

        2
  •  14
  •   Johan    11 年前

    就像这样。

    #include <stdio.h>
    #include <errno.h>
    #include <linux/unistd.h>       /* for _syscallX macros/related stuff */
    #include <linux/kernel.h>       /* for struct sysinfo */
    #include <sys/sysinfo.h>
    
    long get_uptime()
    {
        struct sysinfo s_info;
        int error = sysinfo(&s_info);
        if(error != 0)
        {
            printf("code error = %d\n", error);
        }
        return s_info.uptime;
    }
    

    有关更多信息,请参阅“man sysinfo”。

        3
  •  13
  •   bdonlan    17 年前

    读取文件 /proc/uptime 以第一个十进制数作为正常运行时间(秒)。

    从 man 5 proc :

       /proc/uptime
              This file contains two numbers: the uptime of the  system  (sec‐
              onds), and the amount of time spent in idle process (seconds).
    
        4
  •  2
  •   opello    13 年前

    还有 clock_gettime (可能需要) -lrt )我所看到的行为(我不会声称它是有保证的),但是 CLOCK_MONOTONIC 作为 clk_id 是返回给定时间内的系统正常运行时间 struct timespec * 参数。

    #include <stdio.h>
    #include <time.h>
    
    int main(int argc, char* argv[]) {
      struct timespec t;
      clock_gettime(CLOCK_MONOTONIC, &t);
      printf("tv_sec=%llu tv_nsec=%llu\n",
        (unsigned long long)t.tv_sec,
        (unsigned long long)t.tv_nsec);
      return 0;
    }
    
        5
  •  0
  •   Johnny Buckallew Stroud    10 年前
    #include <sys/sysinfo.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <grp.h>
    
    int main() {
      struct sysinfo sys_info;
      struct group* grp;
    
        gid_t gid;
        char** users;
    
      int days, hours, mins, x = 1;
    
      system("clear");  
      printf("\033[4;40m            Systems information                   \033[0;m \n");
      if(sysinfo(&sys_info) != 0)
        perror("sysinfo");
    
      days = sys_info.uptime / 86400;
      hours = (sys_info.uptime / 3600) - (days * 24);
      mins = (sys_info.uptime / 60) - (days * 1440) - (hours * 60);
    
      printf("\033[1;33m  Uptime: \033[0;36m %ddays, %dhours, %dminutes, %ldseconds \033[0;m \n",
                          days, hours, mins, sys_info.uptime % 60);
    
      printf("\033[1;33m  Load Avgs: \033[0;m 1min(%ld) 5min(%ld) 15min(%ld) \n",
              sys_info.loads[0], sys_info.loads[1], sys_info.loads[2]);
    
      printf("\033[1;33m  Total Ram: \033[0;m %ldk \t Free: %ldk \n", sys_info.totalram / 1024, sys_info.freeram / 1024);
      printf(" \033[1;33m Shared Ram: \033[0;m %ldk ", sys_info.sharedram / 1024);
      printf("  Buffered Ram: %ldk \n", sys_info.bufferram / 1024);
      printf("\033[1;33m  Total Swap: \033[0;m %ldk \t Free swap: %ldk \n", sys_info.totalswap / 1024, sys_info.freeswap / 1024);
      printf("\033[1;33m  Total High Memory: \033[0;m %ldk  Free high memory: %ldk \033[0;m \n", sys_info.totalhigh / 1024, sys_info.freehigh / 1024);
      printf(" \n");
      printf("\033[1;44m Total Number of processes: %d \033[0;m \n", sys_info.procs);  
      gid = getgid();
        printf("  Group ID: \033[031m %d", gid);
        if((grp = getgrgid(gid)) == NULL ) return 1;
        printf("\033[0;m Group %s ", grp->gr_name );
        printf("\n  Users in your group ");
        for( users = grp->gr_mem; *users != NULL; users++,++x ); printf( "%d", ++x);     
        if(strcmp(grp->gr_passwd,"x") == 0) printf("  Password is protected by shadow file. \n");
        else printf("Password: %s ", grp->gr_passwd);   
    
        return 0;
    }