我正在尝试在内核模块中获取进程启动时间 我得到proc struct pointer,并从proc我取字段p_mstart()
typedef struct proc {
.....
/*
* Microstate accounting, resource usage, and real-time profiling
*/
hrtime_t p_mstart; /* hi-res process start time */
这个给我的号码是:1976026375725303
struct proc* iterated_process_ptr = curproc
LOG("***KERNEL***: PID=%d, StartTime=%lld",iterated_process_ptr->p_pidp->pid_id, iterated_process_ptr->p_mstart);
这是多少? 在文档solaris中写道:
The gethrtime() function returns the current high-resolution real time. Time is expressed as nanoseconds since some arbitrary time in the past.
在Solaris Internals一书中,他们写道:
Within the process, the operating system maintains a high-resolution teimstamp that marks process start and terminate times, A p_mstart field, the process start time, is set in the kernel fork() code when the process is created.... it return 64-bit value expressed in nanosecond
号码1976026375725303完全没有意义。
如果我除以1,000,000,000然后除以3600以获得时间,我得到528小时,22天,但我的正常运行时间为5天..
答案 0 :(得分:1)
根据google网上收到的回复:comp.unix.solaris。
而不是去proc - > p_mstart
我需要
iterated_process_ptr ->p_user.u_start
这为我带来了与用户空间
相同的结构(timestruc_t)typedef struct psinfo {
psinfo ->pr_start; /* process start time, from the epoch */
答案 1 :(得分:1)
编号1976026375725303完全没有意义。
是的。根据您引用的文档:
时间表示为自纳秒以来的某个任意时间 过去。
因此,该值可用于计算流程开始的时间:
hrtime_t howLongAgo = gethrtime() - p->p_mstart;
这会产生一个以纳秒为单位的值,因为该过程开始的时间是多长时间。
请注意,生成的值是准确的 - 来自iterated_process_ptr ->p_user.u_start
的值受系统时钟更改的影响,因此您无法说,"此过程已运行3小时,15分钟,3秒钟"除非您也知道系统时钟没有以任何方式重置或修改。
根据Solaris 11 gethrtime.9F man page:
<强>描述强>
gethrtime()
函数返回当前的高分辨率实数 时间。 从某个任意时间开始,时间表示为纳秒 过去;它与时间没有任何关联,和 因此不会通过adjtime(2)
或settimeofday(3C)
重置或漂移gethrtime()
。高分辨率计时器非常适合性能 测量任务,需要便宜,准确的间隔时间。返回值
gethrtime(3C)
始终返回当前的高分辨率实时。 没有错误条件。...
备注强>
虽然高分辨率时间的单位总是相同的(纳秒), 实际分辨率取决于硬件。高保真时间有保证 单调(它不会后退,它不会定期 包装)和线性(它不会偶尔加速或减速 调整,如一天中的时间可以),但不一定是唯一的:两个 足够接近的调用可能会返回相同的值。
此功能使用的时基与
google.com -> sign in
。这两个函数返回的值都可以 交错用于比较目的。