我一直想在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
感谢您抽时间阅读 !:)
fork()
Linux中的有所不同,并且可能是在所有BSD中)借用其父级的地址空间。除了调用execve()
或以外_exit()
,它所做的任何事情都极有可能使父母混乱。特别是,exit()
调用atexit()
处理程序和其他“终结器”,例如:它刷新stdio流。从vfork()
孩子那里回来可能会(和以前一样警告)弄乱父母的书堆。
fork
syscall 的线程?