我想在谷歌上找到这四个电话之间的区别,我预计这方面会有大量信息,但这四个电话之间真的没有任何可靠的比较.
我开始try 编译一种基本的概览,看看这些系统调用之间的差异,下面是我得到的.所有这些信息都正确吗/我遗漏了什么重要信息吗?
Fork
:fork调用基本上复制了当前流程,几乎在所有方面都是相同的(并非所有内容都被复制,例如,在某些实现中,资源限制,但其目的是创建尽可能接近的副本).
新进程(子进程)获取不同的进程ID(PID),并将旧进程(父进程)的PID作为其父进程PID(PPID).因为这两个进程现在运行的代码完全相同,所以它们可以通过fork的返回代码来判断哪个是哪个——子进程得到0,父进程得到子进程的PID.当然,假设fork调用可以工作,则不会创建任何子对象,父对象会得到一个错误代码.
Vfork
:vWork和fork的基本区别在于,当使用vWork()创建新进程时,父进程会暂时挂起,子进程可能会borrow 父进程的地址空间.这种奇怪的状态一直持续到子进程退出或调用execve(),此时父进程
这意味着vWork()的子进程必须小心,避免意外修改父进程的变量.尤其是,子进程不能从包含vWork()调用的函数返回,也不能调用exit()(如果需要退出,应该使用_exit();实际上,对于普通fork()的子级也是如此.
Exec :
exec调用是一种基本上用新程序替换整个当前进程的方法.它将程序加载到当前进程空间,并从入口点运行.exec()用函数指向的可执行文件替换当前进程.控件永远不会返回到原始程序,除非出现exec()错误.
Clone :
克隆作为fork创建了一个新的进程.与fork不同,这些调用允许子进程与调用进程共享部分执行上下文,例如内存空间、文件描述符表和信号处理程序表.
使用克隆创建子进程时,它会执行函数application fn(arg).(这与fork不同,fork从原始fork调用的点开始在子对象中继续执行.)fn参数是指向子进程在其执行开始时调用的函数的指针.arg参数被传递给fn函数.
当fn(arg)函数应用程序返回时,子进程终止.fn返回的整数是子进程的退出代码.子进程也可以通过调用exit(2)或在接收到致命信号后显式终止.
获取的信息表格:
- Differences between fork and 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
感谢您抽出时间阅读本文!:)