На этот вопрос уже есть ответ здесь:
Здравствуйте, у меня есть сценарий 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.
Если рассматриваемый сценарий оболочки только содержит единственную команду, которая вызывает внешнюю программу, можно предварительно ожидать команду с exec
заменять процесс оболочки вместо того, чтобы породить новый процесс. Например, изменение
/path/to/my-program "$@"
кому:
exec /path/to/my-program "$@"
С тех пор my-program
теперь заменяет процесс оболочки, он сохраняет свой PID и получает все сигналы, отправленные в него PID, включая SIGINT. Очевидно, Вы не можете отправить сигнал в него на основе имени или командной строки сценария оболочки больше.