web-dev-qa-db-ja.com

プロセスfork()間でメモリを共有する方法は?

Fork子では、グローバル変数を変更しても、メインプログラムでは変更されません。

子フォークのグローバル変数を変更する方法はありますか?

#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

共有メモリ(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;
}
78
md5

新しく作成されたプロセス(子)が独自のアドレス空間を持っているため、グローバル変数を変更することはできません。

したがって、POSIX apiからshmget()shmat()を使用することをお勧めします

または、pthreadpthreadsdataを共有しており、グローバル変数の変更が親に反映されるため、globalを使用できます。

7
Omkant