关于这个话题有很多话要说,其中一些可以作为答案,其中大部分需要进一步阅读。
对于Q1,我会在概念上说是的,但工作不是自动的,工作跟踪和控制也不是神奇的。我在您展示的代码片段中看不到任何逻辑,例如建立和维护工作表。我知道这只是一个示例,因此作业控制逻辑可能在其他地方。作业控制是常见的现有 Unix shell 的一项功能,但如果一个人从头开始编写新的 Unix shell,则需要添加作业控制功能,如代码/逻辑。
对于Q2,你说的不是我说的。在第一次调用fork() 之后,是的,有一个 p1 和一个 c1,但首先要认识到 p1 和 c1 是 same 程序的不同实例(shellex);只有在调用execve() 之后,exampleProgram 才会运行。 fork() 创建shellex 的子实例,execve() 导致shellex 的子实例被exampleProgram 替换(在RAM 中)(假设这是argv[0] 的值)。
没有真正意义上的父母正在“执行”孩子,也没有在execve()上替换孩子的过程,只是为了让他们继续前进。父启动子进程并可能等待子进程完成,但实际上父进程及其整个子进程层次结构都在各自执行,正在执行由内核。
但是是的,如果被告知要运行的程序应该在后台运行,那么shellex 将接受进一步的输入,并且在下一次调用fork() 时,将有父shellex 和两个孩子过程。同样,起初子 c2 将是 shellex 的一个实例,很快就会通过 execve() 被任何已命名的程序替换。
(关于在后台运行,&是否有这种效果取决于示例代码中名为parseline()的函数内部的逻辑。我熟悉的Shell使用&说“运行这个在后台”,但这并没有什么特别或神奇的地方。一个新编写的 Unix shell 可以用其他方式来完成它,尾随 +,或前导 BG:,或者 shell 作者决定做的任何事情.
对于 Q3 和 Q4,首先要识别的是您调用的父级 p1 是您调用的 shell 程序'已经显示。所以,不,p1 不会参与这项工作。
在 Unix 中,作业是作为单个管道的一部分执行的进程的集合。因此,一项作业可以由一个或多个进程组成。此类进程仍然连接到运行它们的终端,但可能处于前台(运行和交互)、挂起或后台(运行,非交互)。
one process, foreground : ls -lR
one process, background : ls -lR &
one process, background : ls -lR, then CTRL-Z, then bg
many processes, foreground : ls -lR | grep perl | sed 's/^.*\.//'
many processes, background : ls -lR | grep perl | sed 's/^.*\.//' &
要凭经验查看作业与进程,请在后台运行管道(上面 5 个示例中的第 5 个),并在运行时使用 ps 向您显示进程 ID 和进程组 ID。例如,在我的 Mac 版本的 bash 上,是:
$ ls -lR | grep perl | sed 's/^.*\.//' &
[1] 2454 <-- job 1, PID of the sed is 2454
$ ps -o command,pid,pgid
COMMAND PID PGID
vim 2450 2450 <-- running in a different tab
ls -lR 2452 2452 }
grep perl 2453 2452 }-- 3 PIDs, 1 PGID
sed s/^.*\.// 2454 2452 }
与对 shell 和终端的这种连接不同,守护程序从两者分离。启动守护进程时,父进程使用fork() 启动子进程,但随后退出,只留下子进程运行,现在父进程的PID 为1。子进程关闭stdin、stdout 和@ 987654356@,因为那些是没有意义的,因为守护进程“无头”运行。
但在 shell 中,父进程——同样是 shell——要么保持运行 wait()ing(前台子程序),要么不运行 wait()ing(后台子程序),而孩子通常保留对stdin、stdout 和stderr 的使用(尽管这些可能被重定向到文件等)
而且,一个shell 可以调用子shell,当然任何运行的程序都可以fork() 它自己的子进程,等等。因此,流程的层次结构可以变得非常深。如果没有其他特定操作,子进程将与其父进程位于同一进程组中。
这里有一些文章供进一步阅读:
What is difference between a job and a process in Unix?
https://unix.stackexchange.com/questions/4214/what-is-the-difference-between-a-job-and-a-process
https://unix.stackexchange.com/questions/363126/why-is-process-not-part-of-expected-process-group
Bash Reference Manual; Job Control
Bash Reference Manual; Job Control Basics