task_struct -> родитель всегда указывает на root процесс не фактический родитель - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь реализовать модуль, который принимает pid в качестве входных данных и просто печатает некоторые свойства этого процесса. Печать информации братьев и сестер также является частью модуля. Однако, когда я вошел в листовой процесс 2-й или 3-й степени, он напрямую возвращает родителя с pid = 1, который является root. Я не могу понять, почему это происходит.

Вот мой код: (Я знаю, что это не лучший стиль кодирования)

#include <linux/list.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/pid.h>
#include <linux/moduleparam.h>
#include <linux/stat.h>

static int pid = -1;

module_param(pid, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );


int pid_init(void){

    if(pid == -1){
        printk(KERN_ALERT "No input entered!\n");
    }

    struct pid *pid_struct = find_get_pid(pid);
    struct task_struct *ptr = pid_task(pid_struct, PIDTYPE_PID);

    struct task_struct *my_parent = ptr->parent;

    printk(KERN_INFO "Parent PID: %d\n", my_parent->pid);
    printk(KERN_INFO "Parent Name: %s\n", my_parent->comm);


    printk(KERN_INFO "Current State: %ld\n", ptr->state);
    printk(KERN_INFO "Current Name: %s\n", ptr->comm);

    printk(KERN_INFO "Siblings: \n");

    struct task_struct *sib;
    struct list_head *list;

    list_for_each(list, &my_parent->children) {
        sib = list_entry(list, struct task_struct, sibling);
        printk(KERN_INFO "SIbling PID: %d\n", sib->pid);
        printk(KERN_INFO "Sibling state: %ld\n", sib->state);
        printk(KERN_INFO "Sibling name: %s\n", sib->comm);
    }


   return 0;
}


void pid_exit(void){

    printk(KERN_INFO "Removing module ... \n");

}


module_init(pid_init);
module_exit(pid_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Harun Sasmaz");
MODULE_DESCRIPTION("PID MODULE");

Например, когда я говорю: sudo insmod mymodule pid = 821, родитель должен быть 809, но программа переходит на 1.

─udisksd(809)─┬─{udisksd}(821)
              ├─{udisksd}(824)
              ├─{udisksd}(928)
              └─{udisksd}(953)

1 Ответ

0 голосов
/ 14 февраля 2020

Чтобы перечислить потоки и их PID группы процессов, необходимо перебрать потоки структуры group_leader.
Я публикую измененный код здесь:

#include <linux/list.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/sched/signal.h>
#include <linux/pid.h>
#include <linux/moduleparam.h>
#include <linux/stat.h>

static int pid = -1;

module_param(pid, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );


int pid_init(void){


    if(pid == -1){
        printk(KERN_ALERT "No input entered!\n");
    }

    struct pid *pid_struct = find_get_pid(pid);
    struct task_struct *ptr = pid_task(pid_struct, PIDTYPE_PID);

    struct task_struct *leader = ptr->group_leader;
    struct task_struct *t;

    printk(KERN_INFO "Parent PID: %d\n", leader->pid);
    printk(KERN_INFO "Parent Name: %s\n", leader->comm);
    printk(KERN_INFO "PID: %d\n", ptr->pid);  
    printk(KERN_INFO "Threads: %d\n", leader->signal->nr_threads);

    for (t = next_thread(leader); t != leader; t = next_thread(t)) {
        printk(KERN_INFO "CPID: %d %s\n", t->pid, t->comm);
    }
   return 0;
}


void pid_exit(void){

    printk(KERN_INFO "Removing module ... \n");

}


module_init(pid_init);
module_exit(pid_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Harun Sasmaz");
MODULE_DESCRIPTION("PID MODULE");
...