Изменение выхода.C код системного вызова

Здравствуйте ребята мне нужна небольшая помощь здесь. После многих часов изучения и исследования я сдался, я не мог сделать это. Я новичок в программировании ядра, и у меня есть эта задача. Меня просят изменить код системного вызова 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 ответ

  1. SIGTERM уловима и, в частности, может быть проигнорирована. Вместо этого вы хотите отправить SIGKILL. Вы не можете просто использовать системный вызов ‘kill’. Вместо этого, как только вы хватаете указатель на ребенка, вы посылаете сигнал на это. Пример того, как это сделать, ну, в реализации kill syscall.

    Пример кода, который должен изменить список потомков (добавить элемент) будет клонировать. Примером кода, который с большой вероятностью будет пересекать список (и это, вероятно, происходит в вашей версии), будет семейство wait*, например waitid.