Какие из следующих значений определенно одинаковы в родительском и дочернем процессах? - PullRequest
1 голос
/ 27 апреля 2020

Рассмотрим программу ниже.

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. & data C
  4. data C
  5. func_ptr
  6. & func_ptr

Ответ 1,2,3,5, и 6. Я не уверен, почему & data C будет таким же, как это было выделяется после развилки. Может ли кто-нибудь помочь объяснить, что, вообще говоря, может привести к тому, что адрес указателя будет отличаться в дочернем процессе?

1 Ответ

1 голос
/ 27 апреля 2020

Я думаю, что путаница связана с общим / не общим пространством памяти.

Если вы разветвляете процесс, дочерний процесс будет копией родительского. Единственная разница в потомке и родителе - это возвращаемое значение для fork. Это означает, что куча также будет в том же состоянии. Так что если после разветвления ребенок и родитель звонят на malloc, они будут иметь один и тот же адрес. Однако они не будут указывать на такую ​​же память, это потому, что ребенок не разделяет (по умолчанию) память со своим родителем.

Так что, несмотря на то, что dataC имеет "то же самое" значение ptr в обоих процессах, они оба указывают на разные физические адреса. На самом деле все указатели будут.

Вы можете проверить это с небольшими изменениями в вашей программе.

#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
...