我已经在Unix上搜索过任何关于fork但我还没有理解的东西。 例如,当我们在shell(bash)中并运行命令时(让我们说'ls') 我们调用fork()系统调用吗? 'ls'是孩子,当前的shell是父?
在我读到的书中,确切地说“当复制当前正在运行的程序以生成子项时,会生成一个fork,这是正在运行的程序的精确副本”。这是什么意思? bash的确切副本?当我运行ps -ef时,我可以看到并理解PID和PPID(父)。 但为什么书会说明?确切的副本不是同一个程序(程序的相同过程)?
我可以理解exec()系统调用....请有人帮助兄弟....谢谢你
答案 0 :(得分:1)
您了解单个CPU如何执行多个进程,对吧?它是一个短暂的飞跃,可以想象这些过程中的两个可能是相同的,即它们执行完全相同的代码,并共享相同的资源。这基本上是在调用fork()系统调用时发生的情况。
fork()系统调用被设计为一个原语,它是从现有进程生成更多进程的第一步。 fork()调用基本上在内核中创建表示当前进程的数据结构的副本,并开始执行。然后,新进程可以使用完全不同的程序的代码(使用exec()系统调用)覆盖自己,并执行该代码。
任何需要创建另一个进程的进程,都需要先调用fork()来创建自己的副本。然后该副本执行一些其他程序。 Bash必须在每次需要执行另一个程序时执行此操作,例如" ls"或" cp"管他呢。它forks(),然后复制过程继续并执行目标程序。