你好,我有一个 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 之间的区别吗?
答案1
如果相关 shell 脚本仅包含一个调用外部程序的命令,则可以在该命令前面加上exec
to代替shell 进程,而不是生成新进程。例如更改
/path/to/my-program "$@"
到
exec /path/to/my-program "$@"
由于my-program
现在替换了 shell 进程,因此它保留了其 PID 并接收发送给它的所有信号按 PID包括 SIGINT。显然,您不能再根据 shell 脚本的名称或命令行向其发送信号。