Рубрики

fork () и разделенные памятью ч / б процессы, созданные с его помощью

Предварительное условие: fork () в C.

Итак, когда мы делаем fork (), какие разделы на самом деле разделяют два процесса?
Куча памяти на процесс?
Глобальные переменные являются общими?
Будет ли malloc возвращать один и тот же адрес обоим?

Давайте запустим нижеприведенную программу и посмотрим на ее вывод, чтобы очистить вопросы выше.

// C программа для демонстрации работы fork ()
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>

  

int globalVar; / * Глобальная переменная * /

  

int main(void)

{

    int localVar = 0;

    int* p = (int*) malloc(2);

    pid_t childPID = fork();

  

    // Помещаем значение по выделенному адресу

    *p = 0;

  

    if (childPID >= 0) // форк прошел успешно

    {

        if (childPID == 0) // дочерний процесс

        {

            printf("\n Child Process Initial Value :: localVar"

                   " = %d, globalVar = %d", localVar,

                   globalVar);

            localVar++;

            globalVar++;

  

            int c = 500;

            printf("\n Child Process :: localVar = %d, "

                   "globalVar = %d", localVar, globalVar);

            printf("\n Address of malloced mem child = %p "

                   "and value is %d", p, *p);

            printf("\n lets change the value pointed my malloc");

  

            *p = 50;

            printf("\n Address of malloced mem child = %p "

                   "and value is %d", p, *p);

            printf("\n lets change the value pointed my "

                   "malloc in child");

  

            *p = 200;

            printf("\n Address of malloced mem child = %p "

                   "and value is %d\n\n\n", p, *p);

        }

        else // Родительский процесс

        {

            printf("\n Parent process Initial Value :: "

                   "localVar = %d, globalVar = %d",

                   localVar, globalVar);

  

            localVar = 10;

            globalVar = 20;

            printf("\n Parent process :: localVar = %d,"

                  " globalVar = %d", localVar, globalVar);

            printf("\n Address of malloced mem parent= %p "

                   "and value is %d", p, *p);

  

            *p = 100;

            printf("\n Address of malloced mem parent= %p "

                   "and value is %d", p, *p);

            printf("\n lets change the value pointed my"

                    " malloc in child");

            *p = 400;

            printf("\n Address of malloced mem child = %p"

                   " and value is %d \n", p, *p);

        }

    }

    else // вилка не удалась

    {

        printf("\n Fork failed, quitting!!!!!!\n");

        return 1;

    }

  

    return 0;

}

 Parent process Initial Value :: localVar = 0, globalVar = 0
 Parent process :: localVar = 10, globalVar = 20
 Address of malloced mem parent= 0x1bb5010 and value is 0
 Address of malloced mem parent= 0x1bb5010 and value is 100
 lets change the value pointed my malloc in child
 Address of malloced mem child = 0x1bb5010 and value is 400 

 Child Process Initial Value :: localVar = 0, globalVar = 0
 Child Process :: localVar = 1, globalVar = 1
 Address of malloced mem child = 0x1bb5010 and value is 0
 lets change the value pointed my malloc
 Address of malloced mem child = 0x1bb5010 and value is 50
 lets change the value pointed my malloc in child
 Address of malloced mem child = 0x1bb5010 and value is 200

Объяснение ::

  1. Таким образом, каждый дочерний и родительский процессы имеют свою собственную копию globalVariable и localvar, иначе, если бы они поделились ею, мы получили бы «Начальное значение дочернего процесса :: localVar = [10], globalVariable [20]» в дочернем процессе, который был назначен в родительском процессе, который выполняется первым, но мы этого не сделали.
  2. Хотя адрес памяти, возвращаемый функцией malloc, один и тот же, но в действительности они указывают на другой физический адрес или отображаются на него, в противном случае, когда родительскому значению 100 по адресу памяти 0x1535010 присвоены те же 100, которые мы должны были получить в дочернем элементе, но мы получили 0.
  3. Эта статья предоставлена Абхилашем Кумаром Джайсвалом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

    Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

    Рекомендуемые посты:

    fork () и разделенные памятью ч / б процессы, созданные с его помощью

    0.00 (0%) 0 votes