我想在谷歌上找到这四个电话之间的区别,我预计这方面会有大量信息,但这四个电话之间真的没有任何可靠的比较.

我开始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)或在接收到致命信号后显式终止.

获取的信息表格:

感谢您抽出时间阅读本文!:)

推荐答案

  • vfork()是一个过时的优化.在进行良好的内存管理之前,fork()会制作父级内存的完整副本,因此成本相当高.因为在很多情况下,fork()后面跟着exec(),这会丢弃当前的内存映射并创建一个新的内存映射,所以这是不必要的开销.如今,fork()不再复制记忆;它只是简单地设置为"写时复制",所以fork()+exec()的效率与vfork()+exec()一样高.

  • clone()fork()使用的系统调用.使用一些参数,它会创建一个新进程,使用其他参数,它会创建一个线程.它们之间的区别在于哪些数据 struct (内存空间、处理器状态、堆栈、PID、打开的文件等)是共享的还是不共享的.

Linux相关问答推荐

BASH-SCRIPT-在特定行合并两个文件

如何根据具体情况打印两行输出?

为什么库中不调用全局变量的构造函数?

动态链接ELF文件是否需要ELF节头表?

需要获取文件名、行号、模式在文件中的匹配位置

仅在 Linux 上出现 AWS RDS `flush tables` 错误的 mysqldump

如何计算文本的时差,如 YYYYMMDDHHMMSSXXX 格式,包括毫秒

Linux 如何使用 PCID 的值?

查找在特定日期从特定机器登录的所有用户

使用 Dockerfile RUN 执行某些操作但忽略错误

错误:命令gcc在 CentOS 上失败,退出状态为 1

如何更改某些文件模式/扩展名的权限?

pthread_exit 与返回

以原子方式移动目录

在 Linux 上忽略 glob() 中的大小写

Linux下的签名可执行文件

Android - 找不到命令

在 Unix 上计算每行/字段的字符出现次数

使用 WGET 运行 cronjob PHP

如何计算一个单词在目录的所有文件中出现的次数?