-1

我已经在任何地方搜索过有关 Unix 中的 fork 的信息,但我还不明白一些东西。例如,当我们在 shell (bash) 中运行命令时(比如说 'ls'),我们是否在调用 fork() 系统调用?'ls' 是孩子,当前的 shell 是父母?

在我读的书中准确地说“当当前正在运行的程序被复制以创建一个孩子时,就会产生一个叉子,一个正在运行的程序的精确副本”。这是什么意思?bash 的精确副本?当我运行 ps -ef 时,我可以看到并理解 PID 和 PPID(父)。但是为什么书上会这么说呢?精确副本不是同一个程序(程序的相同进程)?

我可以理解 exec() 系统调用....请有人帮助兄弟....谢谢

4

1 回答 1

1

您了解单个 CPU 如何执行多个进程,对吗?想象一下,这些进程中的两个可能是相同的,即它们执行完全相同的代码,并共享相同的资源,这是一个短暂的飞跃。这本质上是调用 fork() 系统调用时发生的情况。

fork() 系统调用被设计为一个原语,它是从现有进程产生更多进程的第一步。fork() 调用基本上会在内核中创建代表当前进程的数据结构的副本,并开始执行。然后,新进程可以用完全不同的程序的代码(使用 exec() 系统调用)覆盖自己,然后执行它。

任何需要创建另一个进程的进程,都需要首先调用 fork() 来创建自己的副本。副本然后执行一些其他程序。每次 Bash 需要执行另一个程序(如“ls”或“cp”或其他任何程序时)都必须这样做。它 forks(),然后复制过程继续执行目标程序。

于 2013-09-12T17:14:15.793 回答