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