【问题标题】:please Explain fork()请解释 fork()
【发布时间】:2013-09-16 15:22:32
【问题描述】:

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

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

而且我能理解 exec() 系统调用....请大侠们帮忙....谢谢

【问题讨论】:

  • 是的,好吧,我说“我不明白精确复制是什么意思”......例如,当我们在 shell 中执行命令时......

标签: unix fork


【解决方案1】:

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

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

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

【讨论】:

  • 让我们举个例子......你在你的shell(bash)上,你想找到一个文件......在前面你执行命令......
  • 你在 shell 中输入命令“find”。 shell 通过搜索 PATH 来定位“find”的可执行文件。然后它调用 fork() 来创建一个新进程。新创建的进程调用 exec() 来执行“查找”程序。
  • 你说“它然后调用 fork() 来创建新进程”....这个进程是外壳?我对吗 ?这是我的困惑....谢谢
  • 是的。 Bash(shell)调用 fork()。
  • 你说“它然后调用 fork() 来创建新进程”。我知道创建的新进程是 SHELL,然后新的 shell 执行 find.... Shell 生成 shell,新的 shell 执行 find.... 对吗?
猜你喜欢
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多