Linux модуль ядра для вывода списка потомков данного pid - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь реализовать модуль, который принимает pid в качестве входного параметра и перечисляет все дочерние pids при загрузке модуля, т.е. вызывается 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;
}

Я пробовал в следующих pids: (вывод 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 & вызовов. Наконец, я использую Ubuntu на тот случай, если вам нужно знать.

...