web-dev-qa-db-fra.com

Comment partager la mémoire entre processus fork ()?

Dans fork enfant, si nous modifions une variable globale, elle ne sera pas modifiée dans le programme principal.

Existe-t-il un moyen de modifier une variable globale dans la fourchette enfant?

#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.
}
54
MOHAMED

Vous pouvez utiliser la mémoire partagée (shm_open(), shm_unlink(), mmap(), etc.).

#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;
}
78
md5

La modification d'une variable globale n'est pas possible car le nouveau processus créé (enfant) possède son propre espace d'adressage.

Il est donc préférable d'utiliser shmget(), shmat() de POSIX api

Ou Vous pouvez utiliser pthread, puisque pthreads partage le globaldata et que les modifications de la variable globale sont reflétées dans le parent.

7
Omkant