Как настроить ловушку сигнала SIG_IGN и SIG_DFL в bash?

Как настроить ловушку сигнала SIG_IGN и SIG_DFL в bash?

От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_IGNbash, и является ли установка обработчика сигналов на пустую команду ""тем же самым, что и установка его на SIG_IGN.

Аналогичный вопрос о том, как настроить ловушку сигнала в SIG_DFLbash.

Спасибо.

решение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его сбросу до обработчика по умолчанию.

Связанный контент