我希望在 Google 上找到这四个之间的区别,并且我预计会有大量关于此的信息,但是这四个调用之间确实没有任何可靠的比较。
我开始尝试编译一种基本的概览,看看这些系统调用之间的差异,这就是我得到的。所有这些信息是否正确/我是否遗漏了任何重要的信息?
Fork:fork 调用基本上复制了当前进程,几乎在所有方面都相同(并非所有内容都被复制,例如,某些实现中的资源限制,但想法是创建尽可能接近的副本)。
Fork
新进程(子)获得不同的进程 ID(PID),并将旧进程(父)的 PID 作为其父 PID(PPID)。因为这两个进程现在运行的代码完全相同,所以它们可以通过 fork 的返回码来判断哪个是哪个——子进程得到 0,父进程得到子进程的 PID。当然,这就是全部,假设 fork 调用有效 - 如果没有,则不会创建子节点并且父节点会收到错误代码。
Vfork:vfork和fork的基本区别在于,当使用vfork()创建新进程时,父进程会暂时挂起,子进程可能会借用父进程的地址空间。这种奇怪的状态一直持续到子进程退出,或者调用 execve(),此时父进程继续。
Vfork
这意味着 vfork() 的子进程必须小心避免意外修改父进程的变量。特别是子进程不能从包含vfork()调用的函数返回,也不能调用exit()(如果需要退出,应该使用_exit();其实对子进程也是如此一个普通的 fork())。
Exec :exec 调用是一种基本上用新程序替换整个当前进程的方法。它将程序加载到当前进程空间并从入口点运行它。exec() 用函数指向的可执行文件替换当前进程。除非出现 exec() 错误,否则控制永远不会返回到原始程序。
Exec :
Clone :克隆,作为分叉,创建一个新进程。与 fork 不同,这些调用允许子进程与调用进程共享其部分执行上下文,例如内存空间、文件描述符表和信号处理程序表。
Clone :
当使用clone 创建子进程时,它执行函数应用程序fn(arg)。(这与 fork 不同,后者从原始 fork 调用开始在子进程中继续执行。) fn 参数是一个指向函数的指针,该函数由子进程在其执行开始时调用。arg 参数被传递给 fn 函数。
当 fn(arg) 函数应用程序返回时,子进程终止。fn 返回的整数是子进程的退出代码。子进程也可以通过调用 exit(2) 或在收到致命信号后显式终止。
信息获取形式:
感谢您抽时间阅读 !:)
vfork()是一个过时的优化。在良好的内存管理之前,fork()制作了父内存的完整副本,因此非常昂贵。因为在许多情况下,afork()后面跟着exec(),它会丢弃当前的内存映射并创建一个新的,这是不必要的开销。如今,fork()不复制内存;它只是设置为“写入时复制”,因此fork()+与+exec()一样有效。vfork()``exec()
vfork()
fork()
exec()
vfork()``exec()
clone()是使用的系统调用fork()。使用一些参数,它创建一个新进程,使用其他参数,它创建一个线程。它们之间的区别只是哪些数据结构(内存空间、处理器状态、堆栈、PID、打开的文件等)是共享的或不共享的。
clone()