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