я новичок в линуксе. (извините за мой плохой английский) Я должен вывести текущее время и что-то сделать через системный вызов в Linux. Я делал другие вещи, но не смог напечатать текущее время. я написал как
#include<linux/kernel.h>
#include<linux/time.h>
...
asmlinkage long sys_printtime(void) {
...
struct timeval time;
struct tm tm1;
...
do_gettimeofday(&time);
local_time=(u32)(time.tv_sec -(sys_tz.tz_minuteswest * 60));
time_to_tm(local_time,(3600*9),&tm1);
printk(KERN_DEBUG "time @(%04d-%02d-%02d %02d:%02d:%02d)\n", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);
...
return 0;
}
но это не работает.
Ошибка говорила, что я не могу использовать do_gettimeofday, и я, наконец, понял, что больше не могу использовать do_gettimeofday, потому что ядро 5 не поддерживает. Я искал в Google и stackoverflow, но я не знаю, как печатать текущее время в kernel5.. кто-нибудь может мне помочь?
Да, do_gettimeofday
был удален из-за проблемы y2038. Вместо этого ядро предоставляет временные интерфейсы, которые вы можете использовать в соответствии с вашими потребностями. Проверьте документацию https://www.kernel.org/doc/html/latest/core-api/timekeeping.html.
Например, у вас есть ktime_get_ts64(struct timespec64 *ts)
, который предоставит вам время в секундах и наносекундах.
struct timespec64 {
time64_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
Если вам нужны только наносекунды, вы можете использовать u64 ktime_get_ns(void)
. Пожалуйста, проверьте документацию выше, чтобы узнать, что подходит для вашей цели.
Также вы можете проверить хронометраж.ч и ktime.h для получения дополнительной информации.
Если вы хотите найти пример, просто найдите имя функции в исходном коде ядра либо с помощью grep -rni <func name>
, либо с помощью cscope
. Вы также можете найти его в Интернете здесь
Большое спасибо! Я уже решил это, используя __ktime_get_real_seconds() :) Я попробую еще раз, используя ktime_get_ts64, как вы сказали. еще раз спасибо х)