如何在进程fork()之间共享内存?

在fork子程序中,如果我们修改一个全局variables,它将不会在主程序中被修改。

有没有办法改变子分叉的全局variables?

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

您可以使用共享内存( 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; } 

更改全局variables是不可能的,因为新创build的进程(子)拥有自己的地址空间。

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

或者你可以使用pthread ,因为pthreads共享global数据,而全局variables的变化会反映在父进程中。