ash*_*hok 0 shell process ubuntu process-management
我正在使用 Linux。当我通过 gedit 命令在 gnome-terminal 中打开gedit程序时,它已打开图形 gedit 文本编辑器。然后 gedit 有 PPID bash
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
Run Code Online (Sandbox Code Playgroud)
这里 820 是bash的 PID
ashokkr+ 820 32505 0 03:32 pts/6 00:00:00 bash
Run Code Online (Sandbox Code Playgroud)
但是当我通过双击 gedit 图标打开相同的 gedit 时。
ashokkrishna@ashokkrishna-Lenovo-B560:~$ ps -eaf | grep gedit
ashokkr+ 1855 1982 14 04:16 ? 00:00:00 /usr/bin/gedit
Run Code Online (Sandbox Code Playgroud)
我得到了 1982 PPID,这是init
1982 ? 00:00:00 init
Run Code Online (Sandbox Code Playgroud)
现在我的问题是为什么父进程在两种情况下都不同?
启动用户进程的确切过程是什么?
你所看到的不应该让你感到惊讶。您已经gedit
通过两个不同的父进程开始了两种不同的方式,因此当然 PPID(父进程 ID)在这两种情况下是不同的。
第一个是 Bash 的子代,因为您是从 Bash 命令行启动它的。
第二个孩子的初始进程将是您的操作系统的 GUI 系统,但由于它被派生到后台,它变得孤立,所以init采用它。这是在Unix/Linux 系统上处理孤立进程的标准方法。
外壳 (Bash) 根本不涉及第二种情况。Bash 是 Gnome Terminal 的子进程,它将由系统的某些核心组件启动。我将其upstart
视为 Ubuntu 14.10 机器上的父级,但在不同的 Linux 和 Unix 系统上会有所不同。当终端关闭时,Bash 也将关闭,任何由 Bash 启动但尚未以某种方式进入后台的程序也将关闭。
最终,所有进程都由内核启动,通常是通过execve(2)
系统调用周围的一些包装器。但是,在这里您不会将内核视为父进程;内核代表某个用户进程运行,因此该进程被记录为父进程。
原因init(8)
不是 PID 1 包含在此处的另一个答案中。