如何读取"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