如何将unsigned long long类型的tick转换为可读时间格式?

时间:2015-11-17 19:48:28

标签: c linux time linux-kernel long-integer

我必须为Linux编写一个内核模块,它写入所有进程的开始时间。 我使用<div class='fc-event orange'>Orange</div> <!-- removed id="1" --> <div class='fc-event red'>Red</div> <!-- removed id="2" --> <div class='fc-event purple'>Purple</div> <!-- removed id="3" --> 来获取有关流程的信息。

struct task_struct

struct task_struct *task = get_current(); struct task_struct *head; struct list_head *current_list; struct rtc_time time; list_for_each(current_list, &task->tasks) { head = list_entry(current_list, struct task_struct, tasks); rtc_time64_to_tm(head->se.exec_start, &time); printk(KERN_INFO "%d:%d:%d %d/%d/%d", time.tm_hour, time.tm_min, time.tm_sec, time.tm_year, time.tm_mon, time.tm_yday); } 使用参数rtc_time64_to_tm(),但long long的类型为head->se.exec_start。这就是我无法将其转换为可读时间格式的原因。

unsigned long long

1 个答案:

答案 0 :(得分:1)

如果代码真的需要在将来展示日期,请利用YMD HMS模式每400年重复一次。

#define SEC_PER400YEAR (60LL*60*24*(365L*400+97))

unsigned long long start = head->se.exec_start;
unsigned long long year = 0;
if (start > LLONG_MAX) {
  year = (start/SEC_PER400YEAR)*400;
  start %= SEC_PER400YEAR;
}
rtc_time64_to_tm((long long) start, &time);

printk(KERN_INFO "%lld/%d/%d", time.tm_year +year, time.tm_mon, time.tm_yday);

IMO,start超过LLONG_MAX的值是可疑的。

注意:if (start > LLONG_MAX)并非真正需要。

如果TZ,DST受到关注,该方法需要一个微小的模式。