我有一个进程,当我在终端中发出 ctrl+c 时,它会完全关闭终端窗口,有人知道为什么会发生这种情况吗?
该过程现在是这样开始的:
exec "$(dirname "$0")/suman-shell" # a
以前是这样启动的,没有问题:
"./$(dirname "$0")/suman-shell" # b
看起来确实是使用 exec 导致终端窗口关闭,那么为什么在收到信号后会a
关闭终端窗口,而不是 呢?b
答案1
通常,所有命令(不是 shell 内置命令)都在子 shell 中执行,即主进程分叉,新进程执行(成为)命令,而主进程(通常)等待子进程完成。
这就是为什么(除了发送信号之外)子进程不能影响主进程的原因。
如果命令是使用内置 shell 启动的,exec
那么主进程不会分叉,而是会变成命令(通过 syscall execve()
)。因此,在命令退出后,不再有主进程可返回。
从终端仿真器的角度来看,shell 已退出(命令exec
退出后),因此窗口关闭。