我有这段代码试图在内核模块上准确地在 simple_init 上打印系统的uptime。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <sys/sysinfo.h>
/* This function is called when the module is loaded. */
int simple_init(void)
{
struct sysinfo info;
sysinfo(&info);
printk("This pc has been on for %ld seconds\n", info.uptime);;
printk(KERN_INFO "Loading Module\n");
return 0;
}
如果不是内核模块,这就是我要做的事,我发现有一个类似的sysinfo linux库,它是 linux / sysinfo ,但是即使我使用那个,只有一个Struct sysinfo而不是一个函数,我可以调用sysinfo(),当我尝试这样做时,我会得到
error: implicit declaration of function ‘sysinfo’ [-Werror=implicit-function-declaration]
sysinfo(&info);
有人知道其他有效的方法吗?
谢谢
答案 0 :(得分:5)
由于您要查找的信息是由内核伪文件/proc/uptime
提供的,因此我们可以查看内核源代码中的fs/proc/uptime.c:uptime_proc_show(),以了解如何收集信息。
当前,相关代码为
#include <linux/ktime.h>
struct timespec uptime;
get_monotonic_boottime(&uptime);
其中uptime.tv_sec
是秒数,uptime.tv_nsec
纳秒(0到999,999,999包括在内)。
但是,由于内核正在转移到64位时间,因此最好使用
#include <linux/ktime.h>
s64 uptime_ms;
uptime_ms = ktime_to_ms(ktime_get_boottime());
以毫秒为单位获取正常运行时间。如果您只需要整秒钟,请使用
#include <linux/ktime.h>
s64 uptime;
uptime = ktime_divns(ktime_get_coarse_boottime(), NSEC_PER_SEC);
(“粗略”表示仅读取整秒部分。)