LINUX.ORG.RU

Сигналы


0

0

Когда завершается процесс, который является лидером сеанса, посылаются ли процессам данного сенса сигнал/сигналы. И что происходит, если этому лидеру приходит какой-либо сигнал, прийдет ли тот же самый сигнал другим процессам сеанса?
Спасибо!

anonymous

Не сеанса, а активной группе терминала (HUP или HUP/CONT).

На самом деле семантика там довольно замороченная - лучше сразу смотреть исходный код или читать POSIX.

По поводу сигнала лидеру. Сигналы приходят только лидеру thread group (по умолчанию каждый процесс является лидером своей thread group, поэтому его сигналы приходят только ему).

Murr ★★
()
Ответ на: комментарий от Murr

shell и все что он породит есть сеанс!!! Если запустить в теминале зацикленую программу, а с другого терминала убить шелл, то и программа тоже грохнеться. Но если процесс форкнулся и стал лидером сеанса, то убив его потмки живут, так как нет управляющего терминала.

А как сделать так чтобы всем процессам сеанса пришел сигнал??? или все процессы получили сигнал в случае смерти лидера???

По поводу лидера группы. Что будет если убить лидера группы состоящей из него и еще трех процессов?

anonymous
()
Ответ на: комментарий от anonymous

>Если запустить в теминале зацикленую программу, а с другого терминала убить шелл, то и программа тоже грохнеться.

Если она в активной группе, то да. Т.к. не ловит HUP. Об этом я в первом сообщении написал.

Если она не в активной группе, то получит сигнал только если есть STOPPED процессы (сложная семантика orphaned процессов).

Всем процессам сеанса сигнал никогда не придет, если они этого не захотят.

По поводу лидера группы... с терминалом вообще ничего не будет. Произойдет отправка HUP/CONT в orphaned группы со STOPPED процессами.

Murr ★★
()
Ответ на: комментарий от Murr

>Всем процессам сеанса сигнал никогда не придет, если они этого не
>захотят

Плиз, расшифруй....тоесть им сигнал все же посылается? а они его перехватывают???

FIXME:

1)Если грохается лидер сеанса и он и его потомки ассоциированы с терминалом (одним и тем же) - то им всем прийдет сигнал! если не ассоциированы, то не прийдет!

2)тоже самое с группой

3) 1 и 2 верно тогда и только тогда когда они ассоциированы с терминалом одним и темже

anonymous
()
Ответ на: комментарий от anonymous

Нет.

Ты пытаешься найти простую трактовку сигналов. На деле же она довольно замороченная.

Смотри по коду ядра(2.4.20):

kernel/exit.c (do_exit):
--->
if (current->leader)
disassociate_ctty(1);

...

exit_notify();
--->

То есть для лидера вызывается disassociate_ctty.

drivers/char/tty_io.c (disassociate_ctty):
--->
if (tty) {
tty_pgrp = tty->pgrp;
if (on_exit && tty->driver.type != TTY_DRIVER_TYPE_PTY)
tty_vhangup(tty);
}

...

if (tty_pgrp > 0) {
kill_pg(tty_pgrp, SIGHUP, on_exit);
if (!on_exit)
kill_pg(tty_pgrp, SIGCONT, on_exit);
}

current->tty_old_pgrp = 0;
tty->session = 0;
tty->pgrp = -1;

read_lock(&tasklist_lock);
for_each_task(p)
if (p->session == current->session)
p->tty = NULL;
read_unlock(&tasklist_lock);

--->
То есть если управляющим является не псевдотерминал, то вызывается tty_vhangup(). Далее, foreground(!) группе терминала посылвается SIGHUP и у каждого процесса в сеансе нулится терминал.

В коде tty_vhangup/do_tty_hangup лидеру сеанса терминала посылается SIGHUP/SIGCONT (хотя вроде бы лидер сеанса всегда является лидером сеанса своего терминала, так что эти сигналы уходят в холостую, то есть текущему процессу). И всем процессам с терминалом лидера нулится терминал.


Остается функция exit_notify, которая всегда выполняется при выходе.
В POSIX определяются orphaned группы, так вот если в результате выхода текущего процесса появятся такие orphaned группы, в которых есть остановленные (STOPPED) процессы, то всей группе будет отправлен SIGHUP и SIGCONT.

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.