PDA

Visualizza la versione completa : [C] Terminazione anomala processo figlio


Prog13
17-02-2014, 16:58
Salve a tutti, mi stavo esercitando sulle memorie condivise ed ho scritto questo programma:


#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?

Loading