2012-11-07 103 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數據和全局變量的變化體現在父母。