linux实现系统调用打印进程信息

在linux中,通过系统调用实现打印出当前进程PID,运行状态等信息,以及父进程的简单信息。若对系统调用过程不了解,可以查看我的博客http://blog.csdn.net/smilematch/article/details/50299275。
在linux中,进程信息存在task_struct结构体中,若对此不了解,可以参考我的博客http://blog.csdn.net/smilematch/article/details/50384709
或者http://www.2cto.com/os/201201/116810.html了解详细信息。

首先,需要创建内核调用文件sys_myprocess.c:

 #include<linux/kernel.h>
 #include<linux/module.h>
 #include<linux/init.h>
 #include<linux/sched.h>

struct task_struct *pcurrent;
struct task_struct *task;
asmlinkage int sys_myprocess(void)
{
pcurrent = get_current();
printk(KERN_INFO "Current :\n pid : %d\n",current->pid);/*当前进程PID*/
printk(KERN_INFO "Task state: %d\n",current->state);/*运行状态,-1为不可运行,0为可运行,>0为运行结束*/
printk(KERN_INFO "Task name: %s\n",current->comm);/*进程名*/
printk(KERN_INFO "Start time:%.24s %1d\n",(current->start_time).tv_sec,(current->start_time).tv_nsec);/*进程开始时间,timespec是纳米级时间,是一个结构体 其定义为:struct timespec             {time_t tv_sec; long tv_nsec;   };*/
int i=0;
for(task=current->parent;task!=&init_task;task=task->parent)
{/*输出父进程直到init*/
    i=i+1;
    printk(KERN_INFO "%d parent pid:%d\n",i,task->pid);
}
printk(KERN_INFO "END By linfeng!\n");
return 1;
}

编写测试程序test_myprocess.c:

#include
#include
#include
#define __NR_myprocess 300
int main(int argc,char *argv[])
{
        syscall(__NR_myprocess);
        return 0;
}

ok,编译执行得以下结果:
linux实现系统调用打印进程信息_第1张图片

你可能感兴趣的:(Linux)