我正在尝试实现一个以pid作为输入参数并在加载模块时列出所有子pid的模块,即,调用了insmod。但是,我不知道如何实现这一目标。我通过看一些教程尝试了一些东西。
到目前为止,我能够获取输入,加载模块并通过其pid查找任务。我无法做的是:我无法列出儿童pids。
这是我的初始化函数:
int pid_init(void){
if(pid == -1){
printk(KERN_ALERT "No input entered!\n");
return 0;
}
struct pid *pid_struct = find_get_pid(pid);
struct task_struct *parent = pid_task(pid_struct, PIDTYPE_PID);
if(parent == NULL){
printk(KERN_ALERT "No process found!\n");
return 0;
}
struct task_struct *task;
struct list_head *list;
printk(KERN_INFO "%d\n", parent->pid);
list_for_each(list, &parent->children) {
task = list_entry(list, struct task_struct, sibling);
printk(KERN_INFO "%d\n", task->pid);
}
return 0;
}
我尝试了以下pid:(pstree -p
的输出]
├─udisksd(783)─┬─{udisksd}(792)
├─{udisksd}(795)
├─{udisksd}(898)
└─{udisksd}(920)
当我打电话:sudo insmod module.ko pid=783
输出是:783
,它是由我打印的,因此它意味着未调用list_for_each
。
但是,当我三次调用sleep 100 &
并用sudo insmod module.ko
执行pid=<bash>
时>
然后我可以列出sleep 100 &
通话的pid。最后,如果您需要了解,我将使用Ubuntu
。
我正在尝试实现一个以pid作为输入参数的模块,并在加载该模块时列出所有子pid,即调用insmod。但是,我不知道如何实现这一目标。我...
pstree ${pid}