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 : 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);
a boucle principal de mon pgm
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);
    }
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
      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);
    }