2012-11-07 30 views
39

Trong con nĩa, nếu chúng ta sửa đổi một biến toàn cục, nó sẽ không bị thay đổi trong chương trình chính.Làm thế nào để chia sẻ bộ nhớ giữa quá trình fork()?

Có cách nào để thay đổi biến toàn cục trong ngã ba trẻ em không?

#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

bản sao có thể có của [Cách sử dụng bộ nhớ dùng chung với Linux trong C] (http://stackoverflow.com/questions/5656530/how-to-use-shared-memory-with-linux-in-c) – alk

Trả lời

68

Bạn có thể sử dụng bộ nhớ chia sẻ (shm_open(), shm_unlink(), mmap(), vv).

#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

có thể bạn cung cấp một ví dụ đơn giản – MOHAMED

+1

Có, tôi sẽ chỉnh sửa. – md5

+0

Bạn sẽ cần tra cứu bộ nhớ dùng chung; rất nhiều ví dụ trên google. Điều này cho phép hai ứng dụng riêng biệt sử dụng cùng một bộ nhớ để lưu trữ và đọc các biến. Khi bạn 'fork()' là một tiến trình, nó tạo ra một tiến trình con với một vùng bộ nhớ riêng biệt từ cha mẹ. Cha mẹ của bạn sẽ duy trì các biến toàn cầu của nó trong khi đứa trẻ sẽ phân bổ các bản sao của riêng nó. – Grambot

5

Thay đổi biến chung không thể thực hiện được vì quy trình tạo (con) mới có không gian địa chỉ riêng.

Vì vậy, nó là tốt hơn để sử dụng shmget(), shmat() từ POSIX api

Hoặc Bạn có thể sử dụng pthread, vì pthreads đang chia sẻ global dữ liệu và những thay đổi trong biến toàn cầu được phản ánh trong mẹ.

Các vấn đề liên quan