Подтвердить что ты не робот

Как обмениваться памятью между процессом fork()?

В fork child, если мы изменим глобальную переменную, она не будет изменена в основной программе.

Есть ли способ изменить глобальную переменную в дочерней вилке?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int glob_var;

main (int ac, char **av)
{
  int pid;

  glob_var = 1;

  if ((pid = fork()) == 0) {
    /* child */
    glob_var = 5;
  }
  else {
    /* Error */
    perror ("fork");
    exit (1);
  }

  int status;
  while (wait(&status) != pid) {
  }
   printf("%d\n",glob_var); // this will display 1 and not 5.
}
4b9b3361

Ответ 1

Вы можете использовать общую память (shm_open(), shm_unlink(), mmap() и т.д.).

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

static int *glob_var;

int main(void)
{
    glob_var = mmap(NULL, sizeof *glob_var, PROT_READ | PROT_WRITE, 
                    MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    *glob_var = 1;

    if (fork() == 0) {
        *glob_var = 5;
        exit(EXIT_SUCCESS);
    } else {
        wait(NULL);
        printf("%d\n", *glob_var);
        munmap(glob_var, sizeof *glob_var);
    }
    return 0;
}

Ответ 2

Изменение глобальной переменной невозможно, потому что новый созданный процесс (дочерний элемент) имеет собственное адресное пространство.

Поэтому лучше использовать shmget(), shmat() из POSIX api

Или Вы можете использовать pthread, так как pthreads делят данные global, а изменения глобальной переменной отражаются в родительском.