Как процесс может убить себя? - PullRequest
1 голос
/ 08 января 2011
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>

int main(){

    pid_t pid = fork();

    if(pid==0){
            system("watch ls");
    }
    else{
            sleep(5);
            killpg(getpid(),SIGTERM);  //to kill the complete process tree.
    }
    return 0;
}

Терминал:

anirudh@anirudh-Aspire-5920:~/Desktop/testing$ gcc test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ ./a.out
Terminated

в течение первых 5 секунд отображается вывод «watch ls», а затем он прекращается, потому что я посылаю SIGTERM.

Вопрос: Как процесс может убить себя?Я сделал kill (getpid (), SIGTERM);

Моя гипотеза: , поэтому во время вызова kill () процесс переключается в режим ядра.Вызов kill отправляет SIGTERM процессу и копирует его в таблицу процессов процесса.когда процесс возвращается в режим пользователя, он видит сигнал в своей таблице и завершает себя (КАК? Я ДЕЙСТВИТЕЛЬНО НЕ ЗНАЮ) (я думаю, что где-то в моей гипотезе я ошибаюсь (может быть, ошибкой) ..Пожалуйста, просветите меня)

Этот код на самом деле является заглушкой, которую я использую для тестирования других моих модулей Проекта.Это делает работу для меня, и я доволен этим, но у меня возникает вопрос, как на самом деле процесс убивает себя.Хочу узнать пошаговую гипотезу.

Заранее спасибо

Анирудх Томер

Ответы [ 5 ]

2 голосов
/ 15 февраля 2011

Ваш процесс умирает, потому что вы используете killpg(), который отправляет сигнал группе процессов, а не процессу.

Когда вы fork(), дети наследуют от отца, помимо прочего, группу процессов. От man fork:

   *  The child's parent process ID is the same as the parent's process ID.

Таким образом, вы убиваете родителя вместе с ребенком.

Если вы выполните простое kill(getpid(), SIGTERM), тогда отец убьет ребенка (то есть watch ing ls) и затем мирно уйдет.

1 голос
/ 15 февраля 2011

, поэтому во время вызова kill () процесс переключается в режим ядра.Вызов kill отправляет SIGTERM процессу и копирует его в таблицу процессов процесса.когда процесс возвращается в режим пользователя, он видит сигнал в своей таблице и завершает себя (КАК? Я ДЕЙСТВИТЕЛЬНО НЕ ЗНАЮ)

В Linux при возврате из режима ядра пользователюВ космическом режиме ядро ​​проверяет, есть ли ожидающие сигналы, которые могут быть доставлены.Если они есть, он подает сигналы непосредственно перед возвратом в режим пользовательского пространства.Он также может доставлять сигналы в другое время, например, если процесс был заблокирован на select(), а затем остановлен, или когда поток обращается к не отображенной области памяти.

0 голосов
/ 29 августа 2014
kill(getpid(), SIGKILL);  // itself I think

Я протестировал его после fork в случае 0: и он регулярно завершался из отдельного родительского процесса.

Я не знаю, является ли это стандартным методом сертификации ...

(из моего инструмента psensor видно, что загрузка ЦП возвращается на 34%, как обычный программный код с счетчик остановился).

0 голосов
/ 15 февраля 2011

Это очень просто в Perl:

   { 
        local $SIG{TERM} = "IGNORE";
        kill TERM => -$$;
   }

Преобразование в C оставлено в качестве упражнения для читателя.

0 голосов
/ 09 января 2011

Я думаю, что когда он видит сигнал SIGTERM в своих таблицах процессов, он сначала убивает свои дочерние процессы (полное дерево, так как я вызвал killpg ()), а затем вызывает exit ().

Я все еще ищу лучший ответ на этот вопрос.

...