
Отhttps://unix.stackexchange.com/a/447032/674
Итак, с точки зрения кода, при наличии
SIGINT
сигнала, возможны три варианта:
signal(SIGINT, SIG_IGN);
игнорировать- Не вызывать
signal()
функцию или вызвать ее с помощьюsignal(SIGINT, SIG_DFL);
и таким образом позволить произойти действию по умолчанию, т.е. завершить процессsignal(SIGINT, termination_handler);
, гдеtermination_handler()
— функция, которая вызывается при первом появлении сигнала.
Как в bash настроить обработчик сигнала так, чтобы он был SIG_IGN
?
trap "" INT
устанавливает пустую команду ""
в качестве обработчика сигнала. Но действительно ли она устанавливает обработчик на SIG_IGN
?
Когда bash выполняет внешнюю команду, он сбрасывает ловушки сигналов на значения по умолчанию и сохраняет игнорируемые сигналы по-прежнему игнорируемыми. Поэтому важно знать, как настроить обработчик сигналов в SIG_IGN
bash, и является ли установка обработчика сигналов на пустую команду ""
тем же самым, что и установка его на SIG_IGN
.
Аналогичный вопрос о том, как настроить ловушку сигнала в SIG_DFL
bash.
Спасибо.
решение1
Из документации POSIXспециальная встроенная утилитаtrap
:
Если action равен
-
, оболочка должна сбросить каждое условие до значения по умолчанию. Если action равен null (""
), оболочка должна игнорировать каждое указанное условие, если оно возникает. В противном случае аргумент action должен быть прочитан и выполнен оболочкой при возникновении одного из соответствующих условий.
Это означает, что ваш скрипт после этого trap "" INT
проигнорирует INT
сигнал, и вы можете сбросить ловушку до значения по умолчанию с помощью trap - INT
.
решение2
Я взял этот сценарий:
#!/bin/bash
trap "" INT
trap - INT
И побежал:
$ strace bash script.sh 2>&1 | grep INT
Среди результатов я вижу:
read(3, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 80) = 35
read(255, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 35) = 35
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0
Учитывая sa_handler=SIG_IGN
в первом вызове rt_sigaction()
и sa_handler=SIG_DFL
во втором, похоже, что trap "" INT
это приводит bash
к фактическому игнорированию сигнала и trap - INT
его сбросу до обработчика по умолчанию.