2009-10-08 48 views
25

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

+0

是有可能得到的正常运行时间在纳秒???你有没有尝试过 ? – Jeyaram 2014-06-10 05:32:58

回答

30

系统调用你要找的是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 */ 
}; 

玩得开心!

+0

我已经按照bdonlan上面的建议读过/ proc/uptime,但是调用API和读取“文件”正是我想要的。谢谢! – 2009-10-11 06:01:06

+0

是否可以获得纳秒级别的信息(用于正常运行时间)? – Jeyaram 2014-06-10 05:31:22

12

阅读文件/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). 
+2

......如果你对'正常运行时间(1)'命令进行分析,你会发现它正是如此。 – caf 2009-10-08 21:37:15

+0

caf:在Linux机器上,BSD机器通常使用“当前时间 - syctl kern.boottime” – Tarrant 2009-10-09 00:58:43

+0

@caf,“uptime(1)”做的不仅仅是这些,所以它可能有点难以找到:) – bdonlan 2009-10-09 02:17:33

11

这将是这样的。

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

+6

你错过了:#包括 Frederik 2011-10-04 10:22:29

3

还有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; 
} 
+0

不,它不;单调时钟具有任意时期。你联系你的手册就是这样说的。 – 2017-05-17 18:55:52

+0

@BoundaryImposition问题标签为linux,而在Linux中,行为是(并且[仍然是](http://elixir.free-electrons.com/linux/latest/ident/CLOCK_MONOTONIC),正如我所描述的那样)。 POSIX说这个时代是任意的,Linux的实现与正常运行时间相关。参见[kernel/time/posix-timers.c](http://elixir.free-electrons.com/linux/latest/source/kernel/time/posix-timers.c)和[fs/proc/uptime.c ](http://elixir.free-electrons.com/linux/latest/source/fs/proc/uptime.c)。 [这里是一个相关的LKML线程](https://lkml.org/lkml/2014/1/2/39)。 – opello 2017-05-23 03:51:10

+0

您链接到实施文件。这可能随时改变。问题是关于API,API说时代是任意的。任意并不意味着没有一个时代,它只是意味着选择不被依赖。您链接到我的LKML线程实际说明了这一点。 – 2017-05-23 09:19:34

0
#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; 
} 
+1

一个好的答案应该不仅包括代码,还包括一些解释它如何工作以及它为什么回答这个问题。这是特别真实的,因为已经有一个被接受的答案。 – Blackwood 2016-01-07 20:28:06

相关问题