【发布时间】:2017-11-18 05:16:45
【问题描述】:
如果我的问题看起来很愚蠢,我很抱歉。我对操作系统中的新进程创建有疑问。考虑以下简单的 C 代码:
//hello.c
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
什么时候用 gcc 编译。
gcc hello.c
现在执行可执行文件 a.out
./a.out
现在我不明白在这种情况下如何创建New Process,谁调用fork() 和exec 系统调用和which process is duplicated 将a.out 作为子进程?在this example中,父进程显式调用fork系统调用来创建子进程,但在上面的hello.c代码中没有fork调用。
【问题讨论】:
-
shell 调用
fork()。它复制自己,然后调用execv()在子进程中执行命令。 -
shell 调用
fork为你的程序创建一个进程在里面运行 -
@Aimal Linux 使用 COW(写时复制),所以
fork()只复制几页,如果不是单页的话。 -
@Aimal,父级有10页,子级只会复制页表,它们都指向同一个框架。当他们中的一个人试图通过写作来改变时,我们就会重复。如果子进程发出
execv(),则它不会复制任何内容,而是执行一个新程序,并在需要时将其页面复制到内存中。 -
感谢@TonyTannous。