如何读取"proc/pid/stat"中的开始时间数据来计算Linux中经过的时间?
How to read the start time data in "proc/pid/stat" to calculate the elapsed time in Linux?
我的目标是编写一个系统调用,查找从正在进行的进程的开始时间开始经过的时间。我正在研究仍在努力理解。首先,我尝试了下面的代码,但它 returned -1,我不确定这是跟踪进程的正确方法。
asmlinkage int sys_deneme(pid_t pid)
{
struct task_struct *task;
struct tms *tms;
int returnValue = 0;
//Is this correct to find a specific process?
//The code returns -1. Why it never enters if part?
for_each_process(task){
if((int)task->pid == pid){
times(tms);
returnValue = returnValue + (int) tms->tms_utime +(int) tms->tms_stime+(int)tms->tms_cutime+(int)tms->tms_cstime;
return returnValue;
}
else{
return -1;
}
}
}
然后我决定使用proc/pid/stat中的数据,但我不知道如何读取给定的pid和return的开始时间.
asmlinkage int sys_deneme(pid_t pid)
{
struct task_struct *task;
struct tms *tms;
int returnValue = 0;
struct kstat *stat;
for_each_process(task){
if((int)task->pid == pid){
returnValue = (int)stat->btime->tv_sec;
return returnValue;
}
else{
return -1;
}
}
}
编辑
根据建议和研究,我成功传递了参数pid,然后打印了pid和name。现在试图找到开始 time/elapsed 时间。
{
struct task_struct *task;
task = pid_task(find_vpid(pid),PIDTYPE_PID);
printk(KERN_INFO "pid %d \n",pid);
printk(KERN_INFO "Name: %s\n",task->comm);
}
(代表问题作者发布解决方案,将其从问题post中移出).
下面加上我写的代码。我搜索了存储过程控制块的位置,找到了一个名为 task_struct 的结构,它存储了许多有用的字段 https://docs.huihoo.com/doxygen/linux/kernel/3.7/structtask__struct.html.
我注意到我无法将参数传递给系统调用。感谢关于这个话题的回答 我已经做到了。最后以秒为单位返回经过的时间。
SYSCALL_DEFINE1(get_elapsed_time, int, pid)
{
struct task_struct *task; //(1)
for_each_process(task){
if(pid == task->pid){
return (((ktime_get_ns())-(task->start_time))/1000000000);
}
}
return -1;
}
//or
//struct task_struct *task;
//task = pid_task(find_vpid(pid),PIDTYPE_PID);
//return (((ktime_get_ns())-(task->start_time))/1000000000);
//found ktime_get_ns() from timekeeping.h
我的目标是编写一个系统调用,查找从正在进行的进程的开始时间开始经过的时间。我正在研究仍在努力理解。首先,我尝试了下面的代码,但它 returned -1,我不确定这是跟踪进程的正确方法。
asmlinkage int sys_deneme(pid_t pid)
{
struct task_struct *task;
struct tms *tms;
int returnValue = 0;
//Is this correct to find a specific process?
//The code returns -1. Why it never enters if part?
for_each_process(task){
if((int)task->pid == pid){
times(tms);
returnValue = returnValue + (int) tms->tms_utime +(int) tms->tms_stime+(int)tms->tms_cutime+(int)tms->tms_cstime;
return returnValue;
}
else{
return -1;
}
}
}
然后我决定使用proc/pid/stat中的数据,但我不知道如何读取给定的pid和return的开始时间.
asmlinkage int sys_deneme(pid_t pid)
{
struct task_struct *task;
struct tms *tms;
int returnValue = 0;
struct kstat *stat;
for_each_process(task){
if((int)task->pid == pid){
returnValue = (int)stat->btime->tv_sec;
return returnValue;
}
else{
return -1;
}
}
}
编辑
根据建议和研究,我成功传递了参数pid,然后打印了pid和name。现在试图找到开始 time/elapsed 时间。
{
struct task_struct *task;
task = pid_task(find_vpid(pid),PIDTYPE_PID);
printk(KERN_INFO "pid %d \n",pid);
printk(KERN_INFO "Name: %s\n",task->comm);
}
(代表问题作者发布解决方案,将其从问题post中移出).
下面加上我写的代码。我搜索了存储过程控制块的位置,找到了一个名为 task_struct 的结构,它存储了许多有用的字段 https://docs.huihoo.com/doxygen/linux/kernel/3.7/structtask__struct.html.
我注意到我无法将参数传递给系统调用。感谢关于这个话题的回答
SYSCALL_DEFINE1(get_elapsed_time, int, pid)
{
struct task_struct *task; //(1)
for_each_process(task){
if(pid == task->pid){
return (((ktime_get_ns())-(task->start_time))/1000000000);
}
}
return -1;
}
//or
//struct task_struct *task;
//task = pid_task(find_vpid(pid),PIDTYPE_PID);
//return (((ktime_get_ns())-(task->start_time))/1000000000);
//found ktime_get_ns() from timekeeping.h