Précédent   Forum des professionnels en informatique > Systèmes > Linux > Système
Système Vos questions autour de l'administration système
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/04/2006, 21h09   #1
Nouveau Membre du Club
 
Inscription : novembre 2005
Messages : 110
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 110
Points : 37
Points : 37
Par défaut 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);
    }
breezer911 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2006, 22h50   #2
Nouveau Membre du Club
 
Inscription : novembre 2005
Messages : 110
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 110
Points : 37
Points : 37
up
breezer911 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2006, 13h40   #3
ALT
Membre Expert
 
Avatar de ALT
 
Homme
Assistant aux utilisateurs
Inscription : octobre 2002
Messages : 944
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 52
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Assistant aux utilisateurs
Secteur : Service public

Informations forums :
Inscription : octobre 2002
Messages : 944
Points : 1 271
Points : 1 271
Boarf !
A priori (je n'ai pas tout compris dans le code, ne connaissant pas les déclarations, en particulier), je dirais qu'utiliser une fonction "handle" après avoir utilisé un kill me paraît audacieux.
Mais ce n'est qu'un avis, sans avoir approfondi la question.
ALT est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h45.


 
 
 
 
Partenaires

Hébergement Web