getnstimeofday adalah front-end untuk __get_realtime_clock_ts tetapi juga berfungsi jika tidak ada jam resolusi tinggi yang tersedia di sistem. Dalam hal ini, getnstimeofday sebagaimana didefinisikan dalam kernel/time.c (bukan kernel/time/timekeeping.c) digunakan untuk menyediakan spesifikasi waktu yang hanya memenuhi persyaratan resolusi rendah.
Kernel linux menyediakan sejumlah antarmuka untuk mengatur waktu. getnstimeofday adalah salah satunya, yang memberikan waktu dalam detik dan nanodetik. Fungsi tersebut diimplementasikan dalam “timekeeping32.h” dan mengembalikan struktur tipe timespec yang memiliki dua anggota.
struct timespec64 { time64_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
Untuk mencetak waktu, kita hanya perlu mencetak nilai tv_sec dan tv_nsec yang diisi oleh pemanggilan fungsi getnstimeofday. Dalam kode contoh berikut, kami telah membuat entri proc yang disebut gettime, yang mencetak nilai detik dan nanodetik saat dibaca.
#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);
Simpan kode di atas sebagai proc_read_gettimeofday.c dan kompilasi kode menggunakan makefile berikut.
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
Kompilasi dan masukkan modul menggunakan:
$ make $ sudo insmod proc_read_getnstimeofday.ko
Untuk melihat output, cukup baca entri proc gettime, menggunakan perintah cat.
# cat /proc/gettime 1584690328 seconds 290430470 nanoseconds