您的位置:首页 > 运维架构 > Linux

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

2015-12-25 21:32 591 查看
在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<sys/syscall.h>
#include<sys/types.h>
#include<stdio.h>
#define __NR_myprocess 300
int main(int argc,char *argv[])
{
syscall(__NR_myprocess);
return 0;
}


ok,编译执行得以下结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux