linux-进程-虚拟内存对父子进程变量地址的影响
fork()地址问题**
#include<stdio.h>
#include<sys/types.h>
#include<signal.h>
#include<stdlib.h>
int main(){
pid_t pid=-1;
int a = 0;
pid = fork();
if(pid>0){
printf("address of a is:%x\n",&a);
a++;
printf("parent a+1,and a = :%d\n",a);
}else{
printf("address of a is:%x\n",&a);
sleep(1);
printf("after sleep 1s and a =%d\n",a);
}
return 0;
}
奇怪的时父子进程的a的地址相同,但是父进程a+1后a=1,子进程还是a=0。
原因是操作系统的虚拟内存技术,操作系统给每个进程分配了虚拟内存,子进程直接复制了父进程的堆栈,所以a的地址一定相同,但实际上,父子进程在两个不同的虚拟内存中,只不过a在虚拟内存的相对位置是一样的。
使用fprintf等带有缓存的c库函数,缓存一样会在父子各自的堆中,同样也受虚拟内存的影