Salve a tutti, mi stavo esercitando sulle memorie condivise ed ho scritto questo programma:
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;
}
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.).
Qualcuno sa darmi una spiegazione?