У меня есть live CD, который загружается в Linux и запускает небольшой скрипт Bash. Скрипт ищет и запускает вторую программу (обычно это скомпилированный бинарный файл C ++).
Вы должны быть в состоянии прервать вторую программу, нажав Ctrl+ C. Что должно произойти, так это то, что вторая программа останавливается, и скрипт Bash продолжает выполнять очистку. На самом деле происходит то, что основное приложение и скрипт Bash завершаются. Что является проблемой.
Поэтому я использовал trap
встроенную функцию, чтобы сказать Bash игнорировать SIGINT. И теперь Ctrl+ Cзавершает работу приложения C ++, но Bash продолжает работать. Отлично.
Ах да ... Иногда "второе приложение" - это другой скрипт Bash. И в этом случае Ctrl+ Cтеперь ничего не делает .
Ясно, что мое понимание того, как это работает, неверно ... Как я могу контролировать, какой процесс получает SIGINT, когда пользователь нажимает Ctrl+ C? Я хочу направить этот сигнал только на один конкретный процесс .
set -m
. Это немного чище и проще, чем использоватьsetsid
каждый раз, когда вы запускаете ребенка.Как я упоминал в комментарии к f01, вы должны отправлять SIGTERM дочернему процессу. Вот несколько сценариев, которые показывают, как перехватывать ^ C и отправлять сигнал дочернему процессу.
Во-первых, родитель.
TRAPtest
А теперь ребенок.
sleeploop
Если traptest отправляет SIGTERM, все идет хорошо, но если traptest отправляет SIGINT, sleeploop никогда его не увидит.
Если sleeploop перехватывает SIGTERM, и режим сна находится на переднем плане, то он не может ответить на сигнал, пока не выйдет из текущего сна. Но если спящий режим является фоновым, он немедленно отреагирует.
источник
В вашем первоначальном скрипте bash.
отслеживать PID второй программы
поймать сигнал
когда вы поймали SIGINT, отправьте SIGINT на второй PID программы
источник