Salve a tutti, mi stavo esercitando sulle memorie condivise ed ho scritto questo programma:
L'unico problema con questo codice è che, ogni volta che eseguo il programma, il figlio termina sempre in uno stato anomalo con codice diverso (ad esempio 12,60,108,28,124, ecc.).codice:#include <stdio.h> #include <stdlib.h> #include <sys/shm.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/wait.h> int main(void){ key_t key= ftok(".",'G'); int shm_id, *shm_ptr; int pid; int status; int num; if((shm_id= shmget(key, sizeof(int), IPC_CREAT|IPC_EXCL|0664)) == -1){ printf("Segmento già esistente. Apertura come client...\n"); if((shm_id= shmget(key, sizeof(int), 0664)) == -1){ perror("shget"); return -1; } } else printf("Creazione segmento condiviso..\n"); if((shm_ptr=shmat(shm_id, 0, 0)) == (void*) -1){ perror("shmat"); return -1; } *shm_ptr=5; num=6; pid=fork(); if(pid==-1) printf("Fork fallita"); else if (pid>0) { printf("Sono il padre, il mio pid è %d, quello di mio figlio è %d, nella shm leggo %d e nel num %d.\n", getpid(),pid,*shm_ptr,num); wait(&status); if(WIFEXITED(&status)) printf("Figlio terminato normalmente con stato %d.\n", WEXITSTATUS(&status)); else printf("Figlio terminato in modo anomalo.\n"); if(WIFSIGNALED(&status)) printf("Figlio terminato in modo anomalo con stato %d.\n", WTERMSIG(&status)); printf("Sono di nuovo il padre, ora in shm leggo %d e in num %d.\n",*shm_ptr,num); printf("Distruggo la memoria condivisa..\n"); shmctl(shm_id, IPC_RMID,0); } else{ printf("Sono il figlio, il mio pid è %d, quello di mio padre è %d, nella shm leggo %d e nel num %d.\n", getpid(),getppid(),*shm_ptr,num); printf("Modifico il contenuto della shm con 2 e di num con 3.\n"); *shm_ptr=2; num=3; exit (0) ; } return 0; }
Qualcuno sa darmi una spiegazione?

Rispondi quotando