LINUX.ORG.RU

Особенность killall


0

0

Есть программа (С++), она вызывает bash-скрипт, который вызывает pppd для установки соединения. Далее, если после запуска pppd взять и прибить его (например из другой консоли) с помощью `killall pppd`, то вызывающая программа также завершается (аналогично происходит и при другом сигнале, например `killall -3 pppd`). Если же подать `killall -9 pppd`, то вызывающая прогрмма продолжает работать.
В чем особенность обычного `killall pppd`? Почему прибивается вызывающая программа(процесс)?
Запуск скрипта для вызова pppd производится с помощью QProcess (если это важно)

★★★★★

2 my mind при получении сигнала вида "умри сам" libc его перехватывает и перед завершением процесса вызывает хуки зарегистрированные через atexit(). При получении SIGKILL libc ничего не делает и не может сделать.

Absurd ★★★
()

Есть подозрение, что при killall без параметров pppd получает сигнал SIGTERM(15) и корректно закрывает пайп, а при kill -9 получает SIGKILL, жёстко стопится и родитель получает SIGPIPE.

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

Не подходит такой вариант, у человека ситуация наоборот, при -9 у него не завершаеться родительский процес.

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

>И с какого это счастья хуки в atexit демона pppd завершают родительский процесс?

Я написал просто чем отличаются SIGTERM и SIGKILL.

Absurd ★★★
()

Попробуй поставить обработчики на все сигналы в вызывающей программе. Так ты получишь номер сигнала, который убивает твой процесс. т.к. я так же склоняюсь к мысли, что там на сигналах что-то творится. Может на самом деле SIGPIPE, но не с такой трактовкой, как тут человек описывал. Может ты SIGCHLD обрабатываешь?

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

> Попробуй поставить обработчики на все сигналы в вызывающей программе.

strace вроде выдает что с сигналами поисходит.

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

>Может ты SIGCHLD обрабатываешь?

В посте написано, что pppd вызывается из баш-скрипта, так что SIGCHLD походу ловит баш.

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

> В посте написано, что pppd вызывается из баш-скрипта, так что SIGCHLD походу ловит баш.

тогда trap 'echo Детишек бьют!' CHLD

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

Провел исследования:

Добавил в bash-скрипт такие строки:
trap "echo trap SIGCHLD > /tmp/0sigchld" SIGCHLD
trap "echo trap SIGINT > /tmp/0sigint" SIGINT
trap "echo trap SIGTERM > /tmp/0sigterm" SIGTERM
Теперь при ручном запуске (из консоли) скрипта, и при прибиванием pppd из другой консоле - в /tmp появляется файл 0sigterm - пока нормально.
Но если запускаю скрипт из программы и опять прибиваю pppd, то файл не появляется, программа завершается.

strace (strace -e trace=signal) не выводят при убиении ничего полезного, но последний вывод в консоль - Terminated. Т.е. SIGTERM дошел до вызывающей программы (почему неясно, ведь сигнал долшен был остановиться на bash скрипте).

В вызывающей программе есть обработчик сигнала SIGTERM, но он для отладки был отключен. Включил и увидел, что да, доходит до меня SIGTERM. Т.к. вызывающая программа демон, то назначение этого обработчика - сделать последние действие и выйти, поэтому игнорировать SIGTERM немогу.

Основная проблема - почему SIGTERM покидает bash-скрипт (не обрабатывается внутри его), а доходит до вызывающей программы?

адро 2.4.x



x905 ★★★★★
() автор топика

Особенностей никаких нет, смотри что там у тебя за скрипты и программы :).

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

в имени bash-скрипта есть слово pppd, но это не влияет т.к. я переименовал (для теста) и поведение такоеже
в имени вызывающей программы нет слова pppd
интересен сам момент - почему SIGTERM доходит до вызывающей программы
ведь она никак не фигурирует при kill (также пробовал прибивать pppd с помощью kill <pppd_pid>)
бегло прочитал стивенса на предмет сигналов, но пока ничего не обнаружил

скрипт простой, основная строка вызова:
pppd ttyS0 9600 mtu 128 mru 128 crtscts modem nodefaultroute noauth nodetach lock connect "/usr/sbin/chat -V -s REPORT CONNECT
ABORT BUSY ABORT 'NO CARRIER' ABORT 'NO DIALTONE' '' ATZ OK ATL2M1W2 OK ATD$2 CONNECT '\d\c'" $ipaddr:

причем, если прибить chat, то все нормально отрабатывается

вызывающая программа посложнее, есть потоки
думаю написать простейший тест без потоков и посмотреть поведение, но наверно это будет в следующем году )

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