我必须为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
答案 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受到关注,该方法需要一个微小的模式。