图 4. 进程 Z 现在独立于它的祖先,即进程 A
分叉
您可以在自己的命令行,很方便地体验分叉操作。首先,打开一个新的 xterm。(您现在可能会认识到,xterm 就是它本身的进程,在 xterm 中,shell 是由 xterm 产生的一个独立进程)。接下来,输入:ps -o pid,ppid,uname,command,state,stime,time
您应该会看到类似这样的内容: PID PPID USER COMMAND S STIME TIME
16351 16350 mstreic -bash S 11:23 00:00:00
16364 16351 mstreic ps -o pid,ppid,u R 11:24 00:00:00
从该列表的 PPID 字段中,我们知道 ps 命令是 bash shell 的子进程。(-bash 中的连字符说明 shell 实例是一个登录 shell。)为了运行 ps,bash 会分叉,创建一个新进程;新进程通过使用执行,使其本身得以重生,转化为 ps 的一个新的实例。
这里是另一个可供尝试的实验。键入:sleep 10 & sleep 10 & sleep 10 & ps -o pid,ppid,uname,command,state,stime,time
您应该会看到类似这样的内容:$ sleep 10 & sleep 10 & sleep 10 & ps -o pid,ppid,uname,command,state,stime,time
PID PPID USER COMMAND S STIME TIME
16351 16350 mstreic -bash S 11:23 00:00:00
16843 16351 mstreic sleep 10 S 11:42 00:00:00
16844 16351 mstreic sleep 10 S 11:42 00:00:00
16845 16351 mstreic sleep 10 S 11:42 00:00:00
16846 16351 mstreic ps -o pid,ppid,u R 11:42 00:00:00
命令行生成四个新进程。在每个 sleep 命令后键入 &,在后台运行每一个命令,或与 Shell 并行。 ps 是生成的另一个进程,但它是在前台运行的,可以防止 shell 在该进程终止之前运行其他命令。而且,如 PPID 的值所示,所有四个进程都是 Shell 的后代。三个 sleep 命令都被标为 S,因为没有哪个进程会在它们睡眠时使用资源。
标签: