首页 > 解决方案 > 列出给定 pid 的子进程的 Linux 内核模块

问题描述

我正在尝试实现一个将 pid 作为输入参数的模块,并在加载模块时列出所有子 pid,即调用 insmod。但是,我不知道如何实现这个目标。我通过查看一些教程尝试了一些东西。

到目前为止,我能够获取输入、加载模块并通过其 pid 查找任务。我不能做的是:我不能列出儿童 pid。

这是我的初始化函数:

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.kopid=<bash>

然后我可以列出sleep 100 &呼叫的 pid。最后,我正在使用Ubuntu以防您需要知道。

标签: clinuxprocesskernelpid

解决方案


推荐阅读