当前位置: 技术问答>linux和unix
fork下父子进程内存的问题
来源: 互联网 发布时间:2016-04-17
本文导语: 我在父进程malloc了一段内存,fork()后这段内存被子进程拷贝,使用中与父进程不相互干扰,但奇怪的是这两端内存的地址竟然是一样的,而且我在子进程中free掉这段内存,也影响不到父进程 我的问题是: 既然是拷贝...
我在父进程malloc了一段内存,fork()后这段内存被子进程拷贝,使用中与父进程不相互干扰,但奇怪的是这两端内存的地址竟然是一样的,而且我在子进程中free掉这段内存,也影响不到父进程
我的问题是:
既然是拷贝过去的内存,那地址就不应该一样
既然地址一样,那就应该是一段相同的内存,free掉后就不会再受影响
请参照以下代码:
int main()
{
char *buffer;
buffer = (char*)malloc(100);
memset(buffer, 0, sizeof(buffer));
memcpy(buffer, "parent", sizeof("parent"));
printf("buffer content in parent: %sn", buffer);
printf("parent buffer address: %dn", (int)buffer);
if (fork() == 0)
{
memset(buffer, 0, sizeof(buffer));
memcpy(buffer, "child", sizeof("child"));
//这儿输出的地址和父进程相同
printf("buffer content in child: %sn", buffer);
printf("child buffer address: %dn", (int)buffer);
//free掉内存
free(buffer);
buffer = NULL;
exit(0);
}
wait(NULL);
printf("parent buffer address next: %dn", (int)buffer);
//这儿依然能够输出内容
printf("buffer content in parent next: %sn", buffer);
return 0;
}
以下是输出:
buffer content in parent: parent
parent buffer address: 135655432
buffer content in child: child
child buffer address: 135655432
parent buffer address next: 135655432
buffer content in parent next: parent
我的问题是:
既然是拷贝过去的内存,那地址就不应该一样
既然地址一样,那就应该是一段相同的内存,free掉后就不会再受影响
请参照以下代码:
int main()
{
char *buffer;
buffer = (char*)malloc(100);
memset(buffer, 0, sizeof(buffer));
memcpy(buffer, "parent", sizeof("parent"));
printf("buffer content in parent: %sn", buffer);
printf("parent buffer address: %dn", (int)buffer);
if (fork() == 0)
{
memset(buffer, 0, sizeof(buffer));
memcpy(buffer, "child", sizeof("child"));
//这儿输出的地址和父进程相同
printf("buffer content in child: %sn", buffer);
printf("child buffer address: %dn", (int)buffer);
//free掉内存
free(buffer);
buffer = NULL;
exit(0);
}
wait(NULL);
printf("parent buffer address next: %dn", (int)buffer);
//这儿依然能够输出内容
printf("buffer content in parent next: %sn", buffer);
return 0;
}
以下是输出:
buffer content in parent: parent
parent buffer address: 135655432
buffer content in child: child
child buffer address: 135655432
parent buffer address next: 135655432
buffer content in parent next: parent
|
你需要理解fork()的本质,
fork后创建的子进程是父进程的内存映像,所以地址应该就是完全一样的。
但是父子的内存地址空间又是不一样的,所以你对一个进程的内存操作并不会影响到另一个进程的内存空间,这里需要了解写时复制的概念.
fork后创建的子进程是父进程的内存映像,所以地址应该就是完全一样的。
但是父子的内存地址空间又是不一样的,所以你对一个进程的内存操作并不会影响到另一个进程的内存空间,这里需要了解写时复制的概念.