kill -9 $PPID завершает процесс?

Re -скачать образ. Убедитесь, что его контрольная сумма совпадает. Переформатируйте флешку. Перепишите его с помощью dd

или

Использовать более быстрый инструмент

0
05.10.2020, 16:21
1 ответ

Я воссоздам ваш эксперимент:

# First shell
$ echo $$
41903

# Start the second shell
$ bash
$ echo $$ $PPID
41934 41903

# Start the third shell
$ bash
$ echo $$ $PPID
41938 41934

Теперь во втором терминале я буду использовать straceдля мониторинга системных вызовов, выполняемых и сигналов, обрабатываемых третьей оболочкой. Обратите внимание, что оболочка заблокирована в ожидании ввода:

$ strace -p 41938
strace: Process 41938 attached
pselect6(1, [0], NULL, NULL, NULL, {[], 8}) = 1 (in [0])

В третьем терминале я убью вторую оболочку (родитель той, которую я отслеживаю):

$ kill -9 41934

В это время я наблюдаю ничего в straceвыводе --третья оболочка все еще работает.

Теперь, если я попытаюсь набрать что-то в первом терминале, я увижу следующее в выводе strace:

read(0, 0x7ffd6879ebbf, 1)              = -1 EIO (Input/output error)
...
write(2, "exit\n", 5)                   = 5
...
setpgid(0, 41938)                       = 0
exit_group(0)                           = ?

Третьей оболочке не удалось прочитать из стандартного ввода (файловый дескриптор 0 --первый параметр в read, в данном случае ), и она завершила свою работу. Уничтожение родительского процесса, по-видимому, каким-то образом изменило состояние терминального устройства, что привело к сбою read()в дочернем процессе.

Давайте повторим эксперимент, но на этот раз проследим первую оболочку --родителя процесса, который я убью.

$ echo $$
48134

$ bash
$ echo $$ $PPID
48163 48134

$ bash
$ echo $$ $PPID
48169 48163

В отдельном терминале отследить первую оболочку:

$ strace -p 48134
strace: Process 48134 attached
wait4(-1, 

В другом терминале убить вторую оболочку:

$ kill -9 48163

Что сделала первоначальная оболочка в ответ на смерть своего ребенка?

wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGKILL}], WSTOPPED|WCONTINUED, NULL) = 48163
rt_sigprocmask(SIG_BLOCK, [CHLD TSTP TTIN TTOU], [CHLD], 8) = 0
ioctl(255, TIOCSPGRP, [48134])          = 0

Обратите внимание на вызов ioctl()с параметром TIOCSPGRP. Когда первая оболочка заметила, что ее дочерний процесс завершился, она изменила идентификатор группы процессов переднего плана терминала обратно на себя (. Обратите внимание, что fd 255 также является дескриптором открытого файла для терминального устройства ). Вот что привело к сбою read()в третьей оболочке --, которую он пытался прочитать с устройства, но не был в группе процессов переднего плана.

2
18.03.2021, 23:00

Теги

Похожие вопросы