![ctrl+c 完全关闭终端窗口 - 为什么/如何?](https://linux22.com/image/121073/ctrl%2Bc%20%E5%AE%8C%E5%85%A8%E5%85%B3%E9%97%AD%E7%BB%88%E7%AB%AF%E7%AA%97%E5%8F%A3%20-%20%E4%B8%BA%E4%BB%80%E4%B9%88%2F%E5%A6%82%E4%BD%95%EF%BC%9F.png)
我有一个进程,当我在终端中发出 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
退出后),因此窗口关闭。