为什么有些使用“&”从终端运行的程序会关闭,而其他程序却不会?

为什么有些使用“&”从终端运行的程序会关闭,而其他程序却不会?

我只是想知道,例如当我启动时qtox

qtox &

然后关闭终端,qtox关闭它。但是当etherape使用以下命令运行时:

sudo etherape &

关闭终端不会关闭或导致 Etherape 出现任何问题。不同的应用程序有不同的行为,有些在终端关闭时关闭,有些则不关闭,这是为什么?为什么有些关闭而其他的不关闭?我正在运行带有 GNOME 3.18 的 Ubuntu GNOME 15.10。

答案1

当你关闭终端时,终端会向 shell 发送 SIGHUP 信号;而 shell 则会向其所有子进程组(包括后台进程组)发送 SIGHUP 信号;

每个进程如何对信号作出反应完全取决于进程本身:如果进程没有定义信号处理程序并告知内核(通过某些系统调用,如signal()或者sigaction()) 时,内核将执行该信号的默认处理程序,在 SIGHUP 信号的情况下,该默认处理程序将终止该进程。

但是,当您使用 运行命令时,进程及其子进程sudo的 UID会设置为(root);通常,除非发送信号的进程的 UID 是(root) 或与目标进程相同,否则内核会忽略该信号(即:进程不能向另一个用户拥有的进程发送信号,除非发送信号的进程由 root 拥有);这就是为什么用户运行的进程(例如终端运行的 Bash 实例)无法 SIGHUP 进程,并且最终关闭终端不会影响以 启动的进程。sudo00sudosudo

相关内容