我正在尝试编写一个内核模块来检测一个fork炸弹,为此,我想向int descendantCount
添加一个字段task_struct
。到目前为止,这是我的代码:
struct task_struct *pTask;
for_each_process(pTask)
{
struct task_struct *p;
*p = *pTask;
//trace back to every ancestor
for(p = current; p != &init_task; p->parent)
{
//increment the descendant count of p's parent
p->descendantCount = p->descendantCount +1 //want to do something like this
}
}
基本上,我正在尝试遍历每个进程,并且对于每个进程,遍历它的所有祖先并增加祖先的descendantCount
,这是我要添加到{{1}的字段}。
我找到this和this,但我仍然对如何做到这一点感到困惑,因为我是内核编程的新手...我应该去到task_struct
并在那里添加一个字段?像这样:
include/linux/sched.h
任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
目前还不清楚实际的想法是什么 - 这应该在fork上执行吗?无论如何,这个想法是错误的,并且无论伪文本粘贴样本是什么,实施都是错误的。
首先,descendantCount是一个使用camelCase的名称,这使得它与其余的代码不一致。一个不太糟糕的名字就是descendant_count。
计数器修改必须使用原子操作来不丢失写入或整个事物需要使用独占锁。
遍历使用 - > parent可以使用ptrace进行更改,并开始指向跟踪器。您想要的父级可以在 - > real_parent。
中找到除了没有提供RCU保护外,因此当你遍历它们时可以释放进程,使循环成为免费使用。
使用RCU或tasklist_lock,遍历将是安全的,但是没有意义。当原始父母去世时,Procesess可以被重新定义为init,从而破坏了分层方法。
进程必须以某种方式进行分组,但父< - >子关系不适用于此目的。这种分组的一些有用的例子是cgroups和简单的东西,比如uids / gids。
总而言之,这不起作用。
鉴于您不仅对内核本身而且对C而言都是新手,我只能建议暂时关注用户空间。