请考虑以下程序。
int dataA[8];
int func(int i) {
return i;
}
int main(int argc, char** argv)
{
int *dataB = malloc(1);
fork();
int *dataC = malloc(1);
int (*func_ptr)(int i) = &func;
return 0;
}
以下哪个值在父进程和子进程中绝对相同?假设该fork()不会失败。
答案是1,2,3,5和6。我不确定&dataC为何相同,因为它是在派生之后分配的。有人可以帮忙解释一下,通常导致子进程中的指针地址不同的原因是什么?
我认为混淆点是关于共享/非共享内存空间。
如果您分叉一个进程,则子进程将是父进程的副本。子代与父代之间唯一的区别是fork
的返回值。这意味着堆也将处于相同状态。因此,如果在分叉之后孩子和父母对malloc
进行呼叫,则他们将是相同的地址。但是,它们不会指向same内存,这是因为子级(默认情况下)不与其父级共享该内存。
尽管如此,但在两个过程中都具有“ same” ptr值的dataC
它们都指向不同的physical地址。实际上所有指针都会。
您可以通过对程序进行小的更改来进行测试。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int dataA[8];
int func(int i) {
return i;
}
int main(int argc, char** argv)
{
int *dataB = malloc(1);
*dataB = 2;
dataA[1] = 7;
int pid = fork();
int *dataC = malloc(1);
int (*func_ptr)(int i) = &func;
printf("pid = %d\ndataA = %p\ndataB = %p\ndataC = %p\nfunc_ptr = %p\n", pid, &dataA, dataB, dataC, func_ptr);
if (pid != 0) {
*dataC = 5;
dataA[0] = 3;
}
printf("pid = %d\n*dataB = %d\n*dataC = %d\ndataA[0] = %d\n", pid, *dataB, *dataC, dataA[0]);
return 0;
}
将产生类似:
pid = 26563
dataA = 0x404060
dataB = 0x1275e70
dataC = 0x1275e90
func_ptr = 0x401146
pid = 26563
*dataB = 2
*dataC = 5
dataA[0] = 3
pid = 0
dataA = 0x404060
dataB = 0x1275e70
dataC = 0x1275e90
func_ptr = 0x401146
pid = 0
*dataB = 2
*dataC = 0
dataA[0] = 0