修改exit.c系统调用代码

时间:2016-11-08 19:55:51

标签: linux-kernel operating-system kernel system-calls systems-programming

大家好,我需要一点帮助。经过几个小时的学习和研究,我放弃了,我做不到。我是内核编程的新手,我有这个任务要做。我被要求修改exit()系统调用代码,以便它终止调用进程的所有子进程,然后终止进程。 据我所知,exit()系统调用在父终止后将子进程提供给init进程。我以为我可以通过使用儿童身份证来终止每个孩子并致电:

kill (child_pid, SIGTERM);

我也知道我们可以使用当前全局变量访问调用进程task_struct。 任何人都知道我可以从当前变量中获取所有子PID吗?你知道还有其他解决方案吗?

更新 我找到了一种如何遍历当前过程的孩子的方法。这是我修改过的代码。

void do_exit(long code)
{

struct task_struct *tsk = current;



//code added by me
int nice=current->static_prio-120;

if(tsk->myFlag==1 && nice>10){
    struct task_struct *task; 
    struct list_head *list;
    list_for_each(list, &current->children) { 
    task = list_entry(list, struct task_struct, sibling); 
    //kill child
    kill(task->pid,SIGKILL);

    }


}

这甚至会起作用吗?

1 个答案:

答案 0 :(得分:0)

SIGTERM是可捕获的,特别是可以忽略。您想要发送SIGKILL。你也不能只使用'kill'系统调用。相反,一旦你抓住指向孩子的指针,你就会发送信号。一个如何做的例子就是kill系统调用的实现。

必须修改子列表(添加元素)的示例代码将是克隆。很可能遍历列表的示例代码(可能在您的版本中)可能是wait *系列,例如waitid。