fork()函数用来创建一个新进程,这个新进程被称为原有进程的子进程。fork()产生的自子进程获得父进程的数据空间,堆和栈的副本,此时子进程只拥有副本,并不拥有完整的内存空间,子进程在父进程的地址空间运行。这也就是写时复制。当子进程改变父进程中的数据时,数据就完全复制到子进程中了。
#include <unistd.h>
#include <stdio.h>
int glob = 1; /* on .data section */
int
main(void)
{
int var = 1; /* on stack */
pid_t pid;
printf("before fork\n");
if ((pid = fork()) < 0)
{
fprintf(stderr, "fork error\n");
return 0;
}
else if (pid == 0)
{
glob++;
var++;
}
else
{
sleep(2);
}
printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
return 0;
}
打印:
pid=16155,glob=2,var=2,var1=0
pid=16154,glob=1,var=1,var1=0
由结果可以看出,修改过的变量值都变了,这表明这些变量拥有了新的内存空间。 还有一点就是:父子进程共享正文段。