我正在使用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没有被覆盖在另一个答案中。