2012-11-07 70 views
39

在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. 
} 
+2

可能重复的[如何在C中使用Linux共享内存](http://stackoverflow.com/questions/5656530/how-to-use-shared-memory-with-linux-in-c) – alk

回答

68

可以使用共享存储器(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; 
} 
+1

可能你提供一个简单的例子 – MOHAMED

+1

是的,我会编辑。 – md5

+0

你需要查找共享内存;很多谷歌的例子。这允许两个独立的应用程序使用相同的内存来存储和读取变量。当fork()一个进程时,它会创建一个具有独立内存堆的父进程的子进程。您的父母将保留其全局变量,而孩子将分配自己的副本。 – Grambot

5

更改全局变量是不可能的,因为新创建的进程(子)具有它自己的地址空间。

所以最好使用shmget()shmat()POSIX API

或者您可以使用pthread,因为pthreads共享的global数据和全局变量的变化体现在父母。