以下值在父进程和子进程中绝对相同吗?

问题描述 投票:1回答:1

请考虑以下程序。

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. &dataA
  2. &dataB
  3. &dataC
  4. dataC
  5. func_ptr
  6. &func_ptr

答案是1,2,3,5和6。我不确定&dataC为何相同,因为它是在派生之后分配的。有人可以帮忙解释一下,通常导致子进程中的指针地址不同的原因是什么?

c pointers process fork memory-address
1个回答
1
投票

我认为混淆点是关于共享/非共享内存空间。

如果您分叉一个进程,则子进程将是父进程的副本。子代与父代之间唯一的区别是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
© www.soinside.com 2019 - 2024. All rights reserved.