面试常问
进程定义两个变量,fork函数在子进程返回0,在父进程返回子进程号,可以看到子进程和父进程的变量地址都是一样的,看起来是一个浅拷贝,但是我们看到,在子进程中改变值并不会影响父进程的值,地址一样,但是值不同?其实这里面涉及到一个技术叫写时复制技术,我们要知道,我们看到的地址是虚拟地址,并不是真实的物理地址,每个进程相同的虚拟地址可以对应不同的物理地址。但是写时复制指的是当你改变某个变量时,物理地址才会改变。所以我们这样理解,首先子进程和父进程的虚拟地址和指向的物理地址都一样,但是当改变某个值时,物理地址才发生改变。
一般的变量会深拷贝,但是像文件句柄呢,例如管道这些文件是共享的,也就是浅拷贝的,可以共用的
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
char str[6] = "hello";
int a = 1;
pid_t pid = fork();
if (pid == 0)
{
str[0] = 'b';
a=2;
printf("sub str=%s\n", str);
printf("sub a=%x\n", a);
printf("sub a=%x\n", &a);
printf("sub point:%x\n", &str);
}
else
{
sleep(1);
printf("main str=%s\n", str);
printf("main a=%x\n", a);
printf("main a=%x\n", &a);
printf("main point:%x\n", &str);
}
return 0;
/*
sub str=bello
sub a=2
sub a=ffffe994
sub b=1
sub b=ffffe998
sub point:ffffe9a2
main str=hello
main a=1
main a=ffffe994
main b=2
main b=ffffe998
main point:ffffe9a2
*/
}