Syscall signal provoque un segmentation fault
salut tout le monde,
voilà je suis en train d'écrire une application serveur-client en c, et je dois utilisé les signaux. Mon probleme est que après chaque appel a la fonction kill, l'appel de la fonction handler(que j'ai construite) fonctionne bien, mais c'est lors du retour au programme que la j'ai un segmentation fault...
Comme exemple j'utilise la fct alarm(nb_sec) pour que après nb_sec un signal de type SIGALRM soit lancé au process exécutant... dont le signal est catché traité, et lors du retour dans le programme vlan ca foire ... est-ce que qq aurait une idée de ce que ca pourrait être?
je laisse des bouts de mon code qui concerne justement ce probleme :
Déclaration de sigaction
Code:
1 2 3 4 5 6
|
struct sigaction sig;
sig.sa_handler = handler;
sigemptyset(&sig.sa_mask);
sigaction(SIGINT,&sig,NULL);
sigaction(SIGALRM,&sig,NULL); |
a boucle principal de mon pgm
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
while(1){
if(nombre_de->joueur==1 && alarmEnvoi==0){
alarm(30);
alarmEnvoi=1;
alarmOK=0;
}
if(jeux=0 && nombre_de->joueur==5){
printf("DEBUT DE PARTIE : 5 joueurs\n");
jeux=1;
}
if(jeux==0 && alarmOK==1 && nombre_de->joueur>=2 && nombre_de->joueur<5){
printf("DEBUT DE PARTIE : de 2 a 4 joueurs\n");
jeux=1;
joueurCourant=0;
joue=1;
msgMQ.pid = tabPid[joueurCourant];
msgMQ.u.type= 'J';
if(msgsnd(msgq_id,&msgMQ,sizeof(struct msgMQ),IPC_NOWAIT)<0){
perror("Erreur msgsnd");
exit(EXIT_FAILURE);
}
}
if(read(fifo,&msgFifo,sizeof(struct msgFifo)) <=0){
continue;
}
if(msgFifo.type=='I'){
if(nombre_de->joueur<5 && jeux==0){
printf("Oh on doit inscrire quelqu un\n");
strcpy(joueurs->tabJoueur[nombre_de->joueur].nom,msgFifo.u.s.nom);
strcpy(joueurs->tabJoueur[nombre_de->joueur].prenom,msgFifo.u.s.prenom);
tabPid[nombre_de->joueur]=msgFifo.pid;
printf("SERVER a inscrit : %s %s, pid %d\n", joueurs->tabJoueur[nombre_de->joueur].nom, joueurs->tabJoueur[nombre_de->joueur].prenom,msgFifo.pid);
nombre_de->joueur++;
msgMQ.pid = msgFifo.pid;
msgMQ.u.s.type = 'O';
msgMQ.u.s.numJoueur = nombre_de->joueur;
if(msgsnd(msgq_id,&msgMQ,sizeof(struct msgMQ),IPC_NOWAIT)<0){
perror("Erreur msgsnd");
exit(EXIT_FAILURE);
}
}else{
msgMQ.pid = msgFifo.pid;
msgMQ.u.type = 'K';
if(msgsnd(msgq_id,&msgMQ,sizeof(struct msgMQ),IPC_NOWAIT)<0){
perror("Erreur msgsnd");
exit(EXIT_FAILURE);
}
}
}
printf("il y a %d joueur\n",nombre_de->joueur);
} |
la fct handler()
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| void handler(int numsig){
if(numsig==SIGALRM){
alarmOK=1;
}
if(numsig==SIGINT){
int i=0;
printf("SERVER CLOSING\n");
for(i=0;i<nombre_de->joueur;i++){
msgMQ.pid = tabPid[i];
msgMQ.u.type = 'A';
if(msgsnd(msgq_id,&msgMQ,sizeof(struct msgMQ),IPC_NOWAIT)<0){
perror("Erreur msgsnd");
exit(EXIT_FAILURE);
}
}
if(close(fifo)<0){
perror("Erreur close");
exit(EXIT_FAILURE);
}
shmdt(repartition);
shmdt(nombre_de);
shmdt(joueurs);
delmem(shm_id_nbr_nbj);
delmem(shm_id_repart);
delmem(shm_id_joueur);
exit(EXIT_SUCCESS);
} |