Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 关于fork()和exec()如何工作的混淆_Unix_Operating System - Fatal编程技术网

Unix 关于fork()和exec()如何工作的混淆

Unix 关于fork()和exec()如何工作的混淆,unix,operating-system,Unix,Operating System,考虑以下几点: 我感到困惑的是“父母的孩子复制品”这一步。如果您正在运行一个进程,比如说skype,如果它分叉,它是在复制skype,然后用其他程序覆盖该进程副本吗?此外,如果子进程的内存需求与父进程相差甚远,该怎么办?分配与父级相同的地址空间不是一个问题吗 我觉得我的想法完全错了,可能是因为我把过程想象成执行中的整个程序,而不是像“将数据从X复制到Y”这样的简单指令。很难理解。这是解释了很多,也阅读维基页面和几章的。请注意,fork不会复制正在运行的程序(即/usr/bin/skype可执行

考虑以下几点:

我感到困惑的是“父母的孩子复制品”这一步。如果您正在运行一个进程,比如说skype,如果它分叉,它是在复制skype,然后用其他程序覆盖该进程副本吗?此外,如果子进程的内存需求与父进程相差甚远,该怎么办?分配与父级相同的地址空间不是一个问题吗

我觉得我的想法完全错了,可能是因为我把过程想象成执行中的整个程序,而不是像“将数据从X复制到Y”这样的简单指令。

很难理解。这是解释了很多,也阅读维基页面和几章的。请注意,
fork
不会复制正在运行的程序(即
/usr/bin/skype
可执行文件),但它会延迟复制(使用技术-通过配置)fork的(in)。每个进程都有其地址空间(但可能与其他进程共享某些段,请参阅和…)。由于每个进程都有自己的地址空间,因此一个进程的地址空间的更改(通常)不会影响父进程。但是,进程可能有但随后需要同步:请参阅&

根据
fork
的定义,就在
fork
系统调用之后,父进程和子进程的状态几乎相等(尤其是子进程的地址空间是父进程地址空间的副本)。唯一的区别是
fork
的返回值

execve
正在覆盖当前进程的地址空间和寄存器

请注意,在Linux上,所有进程(除了少数例外,如内核启动的进程,如
/sbin/modprobe
等)都是通过
fork
-ing-从pid 1的初始
/sbin/init
进程获得的

最后,从应用程序的角度来看,-like
fork
中列出的,-是一个基本操作,因为真正的处理是在应用程序内部完成的。玩另见和

一个进程通常是一些机器状态()+它的地址空间+一些内核状态(例如),等等。。。(但请阅读)


花点时间关注我提供给您的所有链接。

所有现代Unix实现都使用这些链接。这使得他们可以在分叉时逃脱惩罚。相反,他们的内存映射包含指向父内存的指针,直到他们开始修改它为止

当一个子进程exec是一个程序时,该程序被复制到内存中(如果它不在内存中),并且该进程的内存映射被更新为指向新程序