Прервать сценарий bash с помощью SIGINT [дубликат]

На этот вопрос уже есть ответ здесь:

Здравствуйте, у меня есть сценарий bash, который является одним лайнером для выполнения части долго выполняющегося кода C ++.Выполнение ps -xaf сценарий выполняется, и код C ++ является его дочерним элементом

script.sh
\_ long_main.cpp

Когда я запускаю код из командной строки и нажимаю ctrl + C, сценарий bash и код C ++ прерываются и останавливают выполнение . Я люблю это.

Однако, когда я запускаю сценарий и выполняю kill -SIGINT PID в своем сценарии, сценарий умирает, и код C ++ продолжает работать. Когда я запускаю ps -xaf , я вижу, что сценарий sh действительно мертв, но код C ++ работает сам по себе, и теперь это процесс верхнего уровня, например:

long_main.cpp

Не могли бы вы подробнее рассказать, что в этом случае разница между CRTL + C и kill -SIGINT.

0
задан 28 February 2018 в 07:39

1 ответ

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

/path/to/my-program "$@"

кому:

exec /path/to/my-program "$@"

С тех пор my-program теперь заменяет процесс оболочки, он сохраняет свой PID и получает все сигналы, отправленные в него PID, включая SIGINT. Очевидно, Вы не можете отправить сигнал в него на основе имени или командной строки сценария оболочки больше.

0
ответ дан 30 October 2019 в 09:00

Другие вопросы по тегам:

Похожие вопросы: