In fork fork, se modifichiamo una variabile globale, non verrà modificata nel programma principale.
C’è un modo per cambiare una variabile globale in fork figlio?
#include #include #include 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. }
È ansible utilizzare la memoria condivisa ( shm_open()
, shm_unlink()
, mmap()
, ecc.).
#include #include #include #include #include #include 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; }
La modifica di una variabile globale non è ansible perché il nuovo processo creato (figlio) sta avendo il proprio spazio di indirizzamento.
Quindi è meglio usare shmget()
, shmat()
da POSIX
api
Oppure È ansible utilizzare pthread
, poiché i pthreads
condividono i dati global
e le modifiche nella variabile globale si riflettono in parent.