【问题标题】:Modifying exit.c system call code修改exit.c系统调用代码
【发布时间】:2017-03-22 13:50:57
【问题描述】:

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

kill (child_pid, SIGTERM);

我也知道我们可以使用 current 全局变量访问调用进程 task_struct。 任何人都知道我可以从 current 变量中获取所有孩子的 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);

    }


}

这甚至会起作用吗?

【问题讨论】:

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


    【解决方案1】:

    SIGTERM 是可捕获的,尤其是可以忽略。您想改为发送 SIGKILL。您也不能只使用“kill”系统调用。相反,一旦你抓住指向孩子的指针,你就会向它发送信号。如何做到这一点的一个例子是,好吧,在 kill 系统调用的实现中。

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

    【讨论】:

    • 我没明白,你能说清楚一点吗?我更新了我的问题,我找到了一种遍历孩子的方法,但这可行吗?
    • 我相信练习的重点是阅读实际代码(如我提到的示例)并从中学习,而不是在没有适当上下文的情况下使用谷歌搜索垃圾示例。特别是,您添加的循环是错误的,因为它没有锁定 tasklist_lock 或任何其他保证列表稳定性的东西。使用 kill(task->pid, ..) 获取 pid 并要求 func 基于 pid 查找任务结构。您从中获取 pid 的任务结构。再次阅读代码。
    • 这并没有回答我的问题。不要只是给我一个提示。我已经有了我需要的所有提示,但我无法实现大局。有人可以给我看一下,并给我一些宝贵的时间吗?
    猜你喜欢
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2019-08-04
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多