当前位置: 技术问答>linux和unix
linux内核空间编程的一个问题
来源: 互联网 发布时间:2016-10-14
本文导语: 各位好: 近日本人刚开始接触linux内核空间编程,想打印系统的进程树,主要是想利用递归的思想。程序基本上都写好了,但当把模块加载进去之后,机器就死机了,连续这样好几次了。检查代码又实在发...
各位好:
近日本人刚开始接触linux内核空间编程,想打印系统的进程树,主要是想利用递归的思想。程序基本上都写好了,但当把模块加载进去之后,机器就死机了,连续这样好几次了。检查代码又实在发现不了问题,希望大家能帮帮忙,小弟将不胜感激。
另外,由于本人刚接触内核空间编程,水品有限,希望大家能说的尽量详细一些,谢谢!代码如下所示:
#include
#include
#include
#include
static int choice=-1;
module_param(choice,int,0);
void printchild(struct task_struct *tasknode,struct task_struct *task)
{
printk(KERN_ALERT"t%dt%sn",task->pid,task->comm);
if(NULL!=task->children.next)
{
tasknode=task=list_entry(task->children.next,struct task_struct,children);
printchild(tasknode,task);
}
else
{
task=list_entry(task->sibling.next,struct task_struct,sibling);
if(task==tasknode||task->sibling.next==task->sibling.prev)
return;
else printchild(tasknode,task);
}
}
static int init_print(void)
{
int i;
struct task_struct *first=NULL;
struct task_struct *tasknode;
struct list_head *head=NULL;
if(0>=choice)
{
tasknode=first=&init_task;
printchild(tasknode,first);
}
return 0;
}
static void exit_print(void)
{
printk(KERN_ALERT"print over and exit!n");
}
module_init(init_print);
module_exit(exit_print);
近日本人刚开始接触linux内核空间编程,想打印系统的进程树,主要是想利用递归的思想。程序基本上都写好了,但当把模块加载进去之后,机器就死机了,连续这样好几次了。检查代码又实在发现不了问题,希望大家能帮帮忙,小弟将不胜感激。
另外,由于本人刚接触内核空间编程,水品有限,希望大家能说的尽量详细一些,谢谢!代码如下所示:
#include
#include
#include
#include
static int choice=-1;
module_param(choice,int,0);
void printchild(struct task_struct *tasknode,struct task_struct *task)
{
printk(KERN_ALERT"t%dt%sn",task->pid,task->comm);
if(NULL!=task->children.next)
{
tasknode=task=list_entry(task->children.next,struct task_struct,children);
printchild(tasknode,task);
}
else
{
task=list_entry(task->sibling.next,struct task_struct,sibling);
if(task==tasknode||task->sibling.next==task->sibling.prev)
return;
else printchild(tasknode,task);
}
}
static int init_print(void)
{
int i;
struct task_struct *first=NULL;
struct task_struct *tasknode;
struct list_head *head=NULL;
if(0>=choice)
{
tasknode=first=&init_task;
printchild(tasknode,first);
}
return 0;
}
static void exit_print(void)
{
printk(KERN_ALERT"print over and exit!n");
}
module_init(init_print);
module_exit(exit_print);
|
task->应该是current宏,current可当作全局变量来用,如current->pid
|
这样写挺好的 至少不会因为写错了 变成赋值语句
|
if(NULL!=task->children.next)
if(0>=choice)
这两句if都看得很不爽~~
if(0>=choice)
这两句if都看得很不爽~~