当前位置: 首页 > 面试题库 >

fork(),vfork(),exec()和clone()之间的区别

公羊瀚
2023-03-14
问题内容

我一直想在Google上找到这四个之间的区别,我希望这方面会有大量的信息,但是这四个调用之间确实没有任何可靠的比较。

我着手尝试汇编一下这些系统调用之间的区别的基本概况,这就是我得到的。所有这些信息是否正确/我是否缺少任何重要信息?

Fork
:fork调用基本上是对当前过程进行复制,几乎在所有方面都相同(例如,并非在某些实现中都复制了所有内容,例如,在某些实现中资源有限,但其想法是创建尽可能近的副本)。

新进程(子进程)获得不同的进程ID(PID),并将旧进程(父进程)的PID作为其父进程PID(PPID)。因为这两个进程现在运行的是完全相同的代码,所以它们可以通过fork的返回码来确定哪个是哪个-
子代为0,父代为子代的PID。当然,这一切都假设fork调用有效-如果不成功,则不会创建任何子代,并且父代会得到错误代码。

Vfork:vfork和fork之间的基本区别在于,当使用vfork()创建新进程时,父进程会暂时挂起,子进程可能会借用父进程的地址空间。这种奇怪的状态一直持续到子进程退出或调用execve(),此时父进程继续。

这意味着vfork()的子进程必须小心,以免意外修改父进程的变量。特别是,子进程一定不能从包含vfork()调用的函数中返回,也一定不能调用exit()(如果需要退出,则应该使用_exit();实际上,对于子进程也是如此)普通fork()的形式。

Exec :exec调用是一种用新程序基本上替换整个当前过程的方法。它将程序加载到当前进程空间并从入口点运行它。exec()将当前进程替换为函数所指向的可执行文件。除非有exec()错误,否则控制权永远不会返回到原始程序。

Clone :克隆(作为分叉)创建一个新进程。与fork不同,这些调用允许子进程与调用进程共享其执行上下文的各个部分,例如内存空间,文件描述符表和信号处理程序表。

使用克隆创建子进程时,它将执行功能应用程序fn(arg)。(这与fork不同,fork从原始fork调用的位置开始在子级中继续执行。)fn参数是指向该函数的指针,该函数在子进程执行开始时即被调用。arg参数传递给fn函数。

当fn(arg)函数应用程序返回时,子进程终止。fn返回的整数是子进程的退出代码。子进程也可以通过调用exit(2)或在接收到致命信号后显式终止。

信息表:

  • fork和exec之间的区别
  • http://www.allinterview.com/showanswers/59616.html
  • http://www.unixguide.net/unix/programming/1.1.2.shtml
  • http://linux.about.com/library/cmd/blcmdl2_clone.htm

感谢您抽时间阅读 !:)


问题答案:
  • vfork()是过时的优化。在进行良好的内存管理之前,fork()请先复制父代的内存,因此非常昂贵。因为在很多情况下,a fork()之后是exec(),它会丢弃当前的内存映射并创建一个新的内存映射,因此这是不必要的开销。如今,fork()不复制内存。它只是设置为“写时复制”,因此fork()+ exec()vfork()+ 一样有效exec()

  • clone()是所使用的syscall fork()。使用某些参数,它创建一个新进程,使用其他参数,它创建一个线程。它们之间的区别只是共享或不共享哪些数据结构(内存空间,处理器状态,堆栈,PID,打开的文件等)。



 类似资料:
  • 本文向大家介绍请你回答一下fork和vfork的区别相关面试题,主要包含被问及请你回答一下fork和vfork的区别时的应答技巧和注意事项,需要的朋友参考一下 参考回答: fork的基础知识: fork:创建一个和当前进程映像一样的进程可以通过fork( )系统调用: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 成功调用

  • 问题内容: 让对PDO的引用等于PDO对象,而不是PDO本身- 我在这里看到同时存在和。在被链接的页面,似乎是用于报表ONLY,并用于,,语句。现在,我是全新的,以PDO,所以我不知道什么是使用它的条款上会 相当尚未 ,所以我将不胜感激为什么要使用不同的方法解释,为什么有不同的方法。 问题答案: 尽管在理论上有任何差异,但无论如何都不应使用这些功能-因此,无需担心。 使用PDO的唯一原因是 对准备

  • 问题内容: 两者都将能够在容器中执行命令。两者都可以分离容器。 那么docker exec和docker attach之间的真正区别是什么? 问题答案: 有一个提交PR添加到文档中: 注意: 此命令()不适用于在容器中运行新进程。请参阅:。 回答“ Docker。如何在运行的容器()中获取bash \ ssh ? ”阐明了区别: (docker> = 1.3)如果使用, 则只能使用shell的一个

  • 问题内容: 我在Linux上有两个进程A和B。我想与进程B共享进程A的文件描述符,现在我只是将其序列化为a 并将其传递给参数,但这是行不通的。 Ac看起来像这样: BC看起来像这样: 但这是行不通的,我也不明白为什么不这样做。我该如何进行这项工作?如果它的工作原理,它是经过共享父母和孩子之间的文件描述符的最佳解决方案和一个? 更新资料 该问题与我提出的问题无关,这是由@OliCharleswort

  • 问题内容: 我错放了太多次了,我想我一直忘记,因为我不知道两者之间的区别,只是一个给了我我期望的价值,而另一个却没有。 为什么是这样? 问题答案: 是的简写形式(尽管请注意,该表达式只会被计算一次。) 是的,即指定一元的到。 例子:

  • 问题内容: 因此,我有一段简单的代码可以打印出整数1-10: 然后,如果仅在第3行上更改一个运算符,它将打印出无限数量的1整数(我知道为什么会这样做)。为什么在运行第二个程序时没有出现语法错误?如果赋值运算符后面跟着一个加法运算符,它不会调用语法错误吗? 问题答案: 与相同, 只是意味着。