获取内核模块solaris中的进程启动时间

时间:2017-06-26 08:06:23

标签: c time solaris unix-timestamp high-resolution

我正在尝试在内核模块中获取进程启动时间 我得到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天..

2 个答案:

答案 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。这两个函数返回的值都可以   交错用于比较目的。