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

POSIX C Discussion :

utiliser le signal posix(SIGINT )


Sujet :

POSIX C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 91
    Points : 47
    Points
    47
    Par défaut utiliser le signal posix(SIGINT )
    Bonjour, j'essaye de faire un programme qui ce compose d'une boucle infinie .Quand ce dernier recoit un signal (SIGINT) il sauve la date et la valeur de la boucle(compteur)dans un fichier.Mon programme est le suivant,le pb c que je n'arrive pas à arreter la boucle en apuyant sur ALT-C.
    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <signal.h>
    #include <time.h>
    #include <fcntl.h> /* O_RDONLY */
    #include <string.h>
     
     
    void rien()
    {	
    	return;
    }
     
     
    int main (){
     
    time_t t;
    char *date;
    FILE *pfich; //pointeur du fichier
    struct sigaction act;
    int i=0;
     
     
    	act.sa_handler =rien;/* fonction à lancer */;
    	sigemptyset(&act.sa_mask);
    	act.sa_flags = 0;
    	sigaction(SIGINT, &act, NULL);    /* fin contrôle-C */
     
     
    	/*ouvrir le fichier de sauvegarde*/
    	pfich=fopen("fichier.txt","w");
     
    	/*lancer la boucle infinie*/	
     
    while (1)
    	{
    	i++;
     
    	}
     
     
     
    	sigsuspend(&act.sa_mask );
    	printf("vous avez appuyer sur la touche t'interruption\n");
    	/*recuperer la date*/
    	time(&t);
    	date=ctime(&t);
    	fprintf(pfich,"%s\n",date);
     
    	printf("Fin\n");
    	return EXIT_SUCCESS;
     
     
    }
    merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Points : 62
    Points
    62
    Par défaut
    Normal, ton programme exécute une boucle infinie comme tu le lui as demandé.

    Ton signal doit être intercepté. Pour t'en convaincre ajoute une trace dans ta fonction d'interception qui affichera quelque chose à chaque signal envoyé.

    Pour sortir de ta boucle, utilise une variable globale positionnée dans la fonction d'interception.

    le sigsuspend(&act.sa_mask ); après la boucle est inutile et oblige a générer un autre signal.


    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <signal.h>
    #include <time.h>
    #include <fcntl.h> /* O_RDONLY */
    #include <string.h>
     
     
    int SignalRecu;
     
    void rien()
    {	
    SignalRecu=1;
    }
     
     
    int main (){
    struct sigaction act;
    int i=0;
     
     
    act.sa_handler =rien;/* fonction à lancer */;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGINT, &act, NULL);    /* fin contrôle-C */
     
     
    /*lancer la boucle infinie*/	
    SignalRecu=0;
     
    while (SignalRecu==0)
      {
      i++;
      }
    printf("vous avez appuyer sur la touche t'interruption\n");
    return EXIT_SUCCESS;
     
     
    }
    Bonne continuation.

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 91
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par Fred83 Voir le message
    Normal, ton programme exécute une boucle infinie comme tu le lui as demandé.

    Ton signal doit être intercepté. Pour t'en convaincre ajoute une trace dans ta fonction d'interception qui affichera quelque chose à chaque signal envoyé.

    Pour sortir de ta boucle, utilise une variable globale positionnée dans la fonction d'interception.

    le sigsuspend(&act.sa_mask ); après la boucle est inutile et oblige a générer un autre signal.


    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <signal.h>
    #include <time.h>
    #include <fcntl.h> /* O_RDONLY */
    #include <string.h>
     
     
    int SignalRecu;
     
    void rien()
    {	
    SignalRecu=1;
    }
     
     
    int main (){
    struct sigaction act;
    int i=0;
     
     
    act.sa_handler =rien;/* fonction à lancer */;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGINT, &act, NULL);    /* fin contrôle-C */
     
     
    /*lancer la boucle infinie*/	
    SignalRecu=0;
     
    while (SignalRecu==0)
      {
      i++;
      }
    printf("vous avez appuyer sur la touche t'interruption\n");
    return EXIT_SUCCESS;
     
     
    }
    Bonne continuation.
    Merci.. c bon j'ai reussi ..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de signal, sigaction
    Par Toutankharton dans le forum C
    Réponses: 1
    Dernier message: 17/05/2007, 19h19
  2. Taille d'un signal Posix ?
    Par DrTank dans le forum POSIX
    Réponses: 7
    Dernier message: 10/03/2007, 11h16
  3. Réponses: 5
    Dernier message: 26/10/2006, 09h23
  4. Pourquoi utiliser les fonctions POSIX ?
    Par sportBlond dans le forum Langage
    Réponses: 5
    Dernier message: 04/09/2006, 17h11

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