为什么从终端打开和双击打开时 PPID 不同

为什么从终端打开和双击打开时 PPID 不同

我正在使用Linux。当我打开时编辑器通过 gedit 命令在 gnome-terminal 中运行程序,它已打开图形 gedit 文本编辑器。那么 gedit 有 PPID巴什

    ashokkrishna@ashokkrishna-Lenovo-B560:~$ ps -eaf | grep gedit
    ashokkr+  1682   820  3 04:09 pts/6    00:00:00 gedit
    ashokkr+  1695  1568  0 04:09 pts/9    00:00:00 grep --color=auto gedit

这里820是PID巴什

ashokkr+   820 32505  0 03:32 pts/6    00:00:00 bash

但是当我通过双击 gedit 图标打开相同的 gedit 时。

ashokkrishna@ashokkrishna-Lenovo-B560:~$ ps -eaf | grep gedit
ashokkr+  1855  1982 14 04:16 ?        00:00:00 /usr/bin/gedit

我得到 1982 PPID 这是在里面

1982 ?        00:00:00 init

现在我的问题是为什么父进程两种情况都有所不同吗?
确切的过程启动是什么用户流程?

答案1

您所看到的不应令您感到惊讶。您通过两个不同的父进程以两种不同的方式启动gedit,因此当然,两种情况下的 PPID(父进程 ID)是不同的。

第一个是 Bash 的子级,因为您是从 Bash 命令行启动它的。

第二个子进程的初始进程将是操作系统的 GUI 系统,但因为它正在被分叉的进入后台,它变得孤立,所以在里面采用它。这是标准方式处理 Unix/Linux 系统上的孤立进程。

shell (Bash) 根本不涉及第二种情况。 Bash 是 Gnome Terminal 的子版本,它将由系统的某些核心组件启动。我upstart在 Ubuntu 14.10 机器上看到的是父级,但这在不同的 Linux 和 Unix 系统上会有所不同。当终端关闭时,Bash 也会关闭,任何由 Bash 启动但尚未以某种方式进入后台的程序也会关闭。

最终,所有进程都是由内核启动的,通常是通过一些围绕内核的包装器execve(2)系统调用。但是,您不会在这里将内核视为父进程;而是将其视为父进程。内核代表某个用户进程运行,因此该进程被记录为父进程。

原因init(8)是PID 1没有被覆盖在另一个答案中

相关内容