From e61a128e795e103758720c5f5e5fae86132d5269 Mon Sep 17 00:00:00 2001 From: Linem Davton Date: Fri, 3 May 2024 16:44:04 +0200 Subject: [PATCH] high resolution system time --- .gitignore | 1 + clock_res.sh | 31 +++++++++++++++++++++++++++++++ high_res_time.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 .gitignore create mode 100755 clock_res.sh create mode 100644 high_res_time.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/clock_res.sh b/clock_res.sh new file mode 100755 index 0000000..5e5a5c3 --- /dev/null +++ b/clock_res.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Define a temporary source file +SOURCE_FILE=$(mktemp /tmp/clock_getres.XXXXXX.c) + +# Create a C program to get clock resolutions +cat <$SOURCE_FILE +#include +#include + +void print_clock_res(clockid_t clk_id, const char* name) { + struct timespec res; + clock_getres(clk_id, &res); + printf("%s resolution: %ld seconds, %ld nanoseconds\\n", name, res.tv_sec, res.tv_nsec); +} + +int main() { + print_clock_res(CLOCK_REALTIME, "CLOCK_REALTIME"); + print_clock_res(CLOCK_MONOTONIC, "CLOCK_MONOTONIC"); + return 0; +} +EOF + +# Compile the C program +gcc -o /tmp/clock_getres $SOURCE_FILE + +# Run the compiled program +/tmp/clock_getres + +# Clean up +rm $SOURCE_FILE /tmp/clock_getres diff --git a/high_res_time.c b/high_res_time.c new file mode 100644 index 0000000..03e948c --- /dev/null +++ b/high_res_time.c @@ -0,0 +1,44 @@ +#include +#include + +void print_clock_res(clockid_t clk_id, const char *name) { + struct timespec res; + clock_getres(clk_id, &res); + printf("%s resolution: %ld seconds, %ld nanoseconds\n", name, res.tv_sec, + res.tv_nsec); +} + +void print_formatted_time(struct timespec *ts) { + char buffer[100]; + struct tm *tm_info; + + tm_info = localtime(&ts->tv_sec); // Convert time_t seconds to struct tm + strftime(buffer, sizeof(buffer), "%a %H:%M:%S", + tm_info); // Format date and time + + long milliseconds = + ts->tv_nsec / 1000000; // Convert nanoseconds to milliseconds + long microseconds = (ts->tv_nsec % 1000000) / 1000; // Remaining microseconds + long nanoseconds = ts->tv_nsec % 1000; // Remaining nanoseconds + + printf("%s.%03ld,%03ld,%03ld\n", buffer, milliseconds, microseconds, + nanoseconds); +} + +int main() { + struct timespec ts; + if (clock_gettime(CLOCK_REALTIME, &ts) == 0) { + printf("CLOCK_REALTIME: "); + print_formatted_time(&ts); + } else { + perror("Failed to get CLOCK_REALTIME"); + } + + if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) { + printf("CLOCK_MONOTONIC: %ld seconds, %ld nanoseconds\n", ts.tv_sec, + ts.tv_nsec); + } else { + perror("Failed to get CLOCK_MONOTONIC"); + } + return 0; +}