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