getnstimeofday je front-end pro __get_realtime_clock_ts, ale funguje také, pokud v systému nejsou k dispozici žádné hodiny s vysokým rozlišením. V tomto případě se getnstimeofday, jak je definováno v kernel/time.c (místo kernel/time/timekeeping.c), používá k poskytnutí časové specifikace, která splňuje pouze požadavky na nízké rozlišení.
Linuxové jádro poskytuje řadu rozhraní pro správu času. getnstimeofday je jedním z nich, který udává čas v sekundách a nanosekundách. Funkce je implementována v „timekeeping32.h“ a vrací strukturu typu timespec, která má dva členy.
struct timespec64 {
time64_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
}; K vytištění času potřebujeme pouze vytisknout hodnoty tv_sec a tv_nsec, které se vyplní voláním funkce getnstimeofday. V následujícím příkladu kódu jsme vytvořili záznam proc s názvem gettime, který při čtení vytiskne hodnoty sekund a nanosekund.
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/slab.h>
int len;
char *msg;
ssize_t size;
struct timespec ts;
ssize_t read_proc(struct file *filp,char *buf,size_t count,loff_t *offp )
{
struct timespec ts;
char *temp;
temp=kmalloc(50*sizeof(char),GFP_KERNEL);
getnstimeofday(&ts);
sprintf(temp,"%ld seconds \n%ld nanoseconds\n",ts.tv_sec, ts.tv_nsec);
len=strlen(temp);
size=sizeof(char)*len;
return simple_read_from_buffer(buf,count,offp,temp,size);
}
struct file_operations proc_fops = {
read: read_proc
};
void create_new_proc_entry(void)
{
proc_create("gettime",0,NULL,&proc_fops);
}
int proc_init (void) {
create_new_proc_entry();
return 0;
}
void proc_cleanup(void) {
remove_proc_entry("gettime",NULL);
}
MODULE_LICENSE("GPL");
module_init(proc_init);
module_exit(proc_cleanup); Uložte výše uvedený kód jako proc_read_gettimeofday.c a zkompilujte kód pomocí následujícího makefile.
ifneq ($(KERNELRELEASE),) obj-m := proc_read_gettimeofday.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: $(MAKE) -C $(KERNELDIR) M=$(PWD) clean endif
Zkompilujte a vložte modul pomocí:
$ make $ sudo insmod proc_read_getnstimeofday.ko
Chcete-li vidět výstup, stačí si přečíst záznam proc gettime pomocí příkazu cat.
# cat /proc/gettime 1584690328 seconds 290430470 nanoseconds