0

Здравствуйте, ребята, мне нужна небольшая помощь здесь. После многих часов учебы и исследований я сдался, я не мог этого сделать. Я новичок в программировании ядра, и у меня есть эта задача. Меня попросят изменить код системного вызова exit(), чтобы он завершил все дочерние процессы процесса вызова, а затем завершил процесс. Насколько я знаю, системный вызов exit() дает дочерним элементам процесс init после завершения работы родителя. Я думал, что может прекратить каждые ребенок с помощью детей и идентификатора вызова:Изменение кода системного вызова exit.c

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); 

    } 


} 

Будет ли это работать?

ответ

0

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

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

+0

Я не получил это может у вас получить более ясно, пожалуйста? Я обновил свой вопрос, я нашел способ, как пересекать детей, но будет ли это работать? –

+1

Я считаю, что в этом упражнении вы читаете фактический код (например, образцы, о которых я упоминал), и учитесь там, в отличие от образцов для игры в googling без правильного контекста. В частности, цикл, который вы добавили, неверен, поскольку он не блокирует tasklist_lock или что-то еще, гарантирующее стабильность списка. С kill (task-> pid, ..) вы берете pid и попросите func искать структуру задачи на основе pid. Сама задача, из которой вы взяли pid. Снова прочитайте код. –

+0

И это не отвечало на мой вопрос. Дон просто дайте мне подсказку. У меня уже есть все намеки, которые мне нужны, но я не могу представить большую картину. Может ли кто-нибудь показать это мне и тому же мне какое-то драгоценное время? –