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