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库函数,缓存一样会在父子各自的堆中,同样也受虚拟内存的影

posted @ 2020-12-24 12:59  lsxkugou  阅读(91)  评论(0编辑  收藏  举报