getnstimeofday è un front-end per __get_realtime_clock_ts ma funziona anche se nel sistema non sono disponibili orologi ad alta risoluzione. In questo caso, getnstimeofday come definito in kernel/time.c (invece di kernel/time/timekeeping.c) viene utilizzato per fornire una specifica temporale che soddisfi solo i requisiti di bassa risoluzione.
Il kernel Linux fornisce una serie di interfacce per gestire il tempo. getnstimeofday è uno di questi, che fornisce l'ora in secondi e nanosecondi. La funzione è implementata in "timekeeping32.h" e restituisce una struttura del tipo timespec che ha due membri.
struct timespec64 {
 time64_t tv_sec;   /* seconds */
 long  tv_nsec;  /* nanoseconds */
}; Per stampare l'ora, dobbiamo solo stampare i valori di tv_sec e tv_nsec che vengono riempiti dalla chiamata alla funzione getnstimeofday. Nel codice di esempio seguente, abbiamo creato una voce di proc chiamata gettime, che stampa i valori di secondi e nanosecondi durante la lettura.
#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); Salva il codice sopra come proc_read_gettimeofday.ce compila il codice usando il seguente 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
Compila e inserisci il modulo utilizzando:
$ make $ sudo insmod proc_read_getnstimeofday.ko
Per vedere l'output, basta leggere la voce proc gettime, usando il comando cat.
# cat /proc/gettime 1584690328 seconds 290430470 nanoseconds