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
a boucle principal de mon pgm
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
la fct handler()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
Partager