Issue
I need to traverse all current processes with DFS(Depth First Search) in linux with C. I need to get parent process name and parent process id of the process named gedit. I'm trying to use getppid function. Here is the code:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
// Not sure of these two include statements:
#include <linux/types.h>
#include <unistd.h>
/* performs a depth-first traversal of the list of tasks in the system. */
void traverse(struct task_struct *ptr) {
struct list_head *list;
struct task_struct *next_task;
pid_t ppid;
if ((thread_group_leader(ptr)) && (strcmp(ptr->comm,"gedit")==0)) {
ppid = getppid();
printk(KERN_INFO "PID:%d\n",ppid); }
list_for_each(list, &ptr->children) {
next_task = list_entry(list, struct task_struct, sibling);
traverse(next_task);
}
}
int simple_init(void)
{
printk(KERN_INFO "Loading Module\n");
printk(KERN_INFO "Gedit's parent process:\n");
traverse(&init_task);
return 0;
}
void simple_exit(void) {
printk(KERN_INFO "Removing Module\n");
}
module_init( simple_init );
module_exit( simple_exit );
I get this error: unistd.h no such file or directory If I try to include linux/unistd.h, I get implicit decleration of getppid function error.
Traversal works, the only problem is libraries and getppid function. Can anyone help me with this?
Solution
You're working with kernel code. There's no C standard library in the kernel! You cannot include standard headers like unistd.h
or use most C standard library functions like getppid()
.
If you want to get the PID of the current parent process from a kernel module you can get it from current->real_parent
.
rcu_read_lock();
ppid = rcu_dereference(current->real_parent)->pid;
rcu_read_unlock();
Answered By - Marco Bonelli Answer Checked By - Clifford M. (WPSolving Volunteer)