IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration système Discussion :

Syscall signal provoque un segmentation fault


Sujet :

Administration système

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    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 : 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);
        }

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut
    up

  3. #3
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    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.
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

Discussions similaires

  1. free() qui provoque une segmentation fault
    Par bringer dans le forum Débuter
    Réponses: 16
    Dernier message: 19/11/2010, 17h46
  2. Program terminated with signal 11, Segmentation fault.
    Par Micr0be dans le forum Débuter
    Réponses: 19
    Dernier message: 28/08/2008, 07h41
  3. Réponses: 0
    Dernier message: 10/01/2008, 23h28
  4. Réponses: 15
    Dernier message: 15/04/2007, 13h31
  5. Fatal signal: Segmentation Fault
    Par samtheh dans le forum SDL
    Réponses: 9
    Dernier message: 25/02/2006, 11h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo