修改exit.c系统调用代码
Modifying exit.c system call code
大家好,我需要一点帮助。经过几个小时的学习和研究,我放弃了,我做不到。我是内核编程的新手,我有这个任务要做。我被要求修改 exit() 系统调用代码,使其终止调用进程的所有 children 进程,然后终止进程。
据我所知,exit() 系统调用在 parent 终止后将 children 提供给 init 进程。我想我可以通过使用 children id 并调用:
来终止每个 children
kill (child_pid, SIGTERM);
我还知道我们可以使用 current 全局变量访问调用进程 task_struct。
有人知道我可以从 current 变量中获取所有 children PID 吗?您知道其他解决方案吗?
更新:
我找到了一种遍历当前进程的 children 的方法。这是我修改后的代码。
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, ¤t->children) {
task = list_entry(list, struct task_struct, sibling);
//kill child
kill(task->pid,SIGKILL);
}
}
这还能用吗?
SIGTERM 是可以捕获的,特别是可以忽略。您想改为发送 SIGKILL。您也不能只使用 'kill' 系统调用。相反,一旦你抓住指向 child 的指针,你就会向它发送信号。如何做到这一点的一个例子是,在 kill 系统调用的实现中。
必须修改 children 列表(添加元素)的示例代码是克隆。一个很可能遍历列表的示例代码(并且它可能在您的版本中这样做)是 wait* 系列,例如waitid.
大家好,我需要一点帮助。经过几个小时的学习和研究,我放弃了,我做不到。我是内核编程的新手,我有这个任务要做。我被要求修改 exit() 系统调用代码,使其终止调用进程的所有 children 进程,然后终止进程。 据我所知,exit() 系统调用在 parent 终止后将 children 提供给 init 进程。我想我可以通过使用 children id 并调用:
来终止每个 childrenkill (child_pid, SIGTERM);
我还知道我们可以使用 current 全局变量访问调用进程 task_struct。 有人知道我可以从 current 变量中获取所有 children PID 吗?您知道其他解决方案吗?
更新: 我找到了一种遍历当前进程的 children 的方法。这是我修改后的代码。
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, ¤t->children) {
task = list_entry(list, struct task_struct, sibling);
//kill child
kill(task->pid,SIGKILL);
}
}
这还能用吗?
SIGTERM 是可以捕获的,特别是可以忽略。您想改为发送 SIGKILL。您也不能只使用 'kill' 系统调用。相反,一旦你抓住指向 child 的指针,你就会向它发送信号。如何做到这一点的一个例子是,在 kill 系统调用的实现中。
必须修改 children 列表(添加元素)的示例代码是克隆。一个很可能遍历列表的示例代码(并且它可能在您的版本中这样做)是 wait* 系列,例如waitid.