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

Linux Discussion :

signaux et alarmes linux


Sujet :

Linux

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Points : 48
    Points
    48
    Par défaut signaux et alarmes linux
    Bonjour,
    Est ce que vous pouvez m'aider a comprendre le mécanisme de signaux en s'appuiant sur ce code en fait je voudrais vous poser ces questions :
    1/la fonction traite_sigaux comprend un argument (num_signal) qui se charge de lui passer cet argument ??
    2/ou est ce qu'on a fait appel a cette routine ?? les deux "IF" ???plus d'explication sur ce point SVP
    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
    void traite_signaux(int num_signal) {
    switch (num_signal) {
    case SIGINT : printf("Interruption reçue, on continue\n"); break;
    case SIGALRM : printf("Fin d'alarme reçue, tant pis\n");
    exit(1); break;
    default : printf("signal non pris en compte\n"); exit(1);
    }
    }
    int main(void) {
    char c;
    //attente du signal
    if (signal(SIGINT, traite_signaux)==SIG_ERR) exit(1);
    if (signal(SIGALRM, traite_signaux)==SIG_ERR) exit(1);
    //attente de CTRL*C
    pause();
    printf("C'est parti\n");
    alarm(5);
    printf("Entrez un caractere avant 5 secondes\n");
    c=getchar();
    alarm(0);
    fflush(stdin);
    printf("caractère frappe : %c\n",c);
    return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    La réponse simpliste, c'est que c'est le système d'exploitation qui se charge d'appeler la fonction traite_signaux() et lui passer le paramètre, quand ton processus "reçoit un signal". C'est le principe des fonctions dites "call back".

    Le processus recevra l'un des deux signaux (SIGINT ou SIGALRM) pendant la fonction bloquante pause() ou getchar(). Une fois le signal traité (s'il ne force pas la fin du programme), pause() ou getchar() retournera -1 après avoir réglé errno à EINTR ("interrompu").

    La plupart des fonctions bloquantes de *n*x peuvent être ainsi interrompues par des signaux.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Points : 48
    Points
    48
    Par défaut
    Pour l'argument c'est clair, mais comment il comprend qu'on veut creer un signal appelant cette routine je pensais qu'on doit declarer ce signal (je commene a decouvrir les signaux aujourd'hui donc excusez moi si je pose des questions betes )

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (signal(SIGINT, traite_signaux)==SIG_ERR) exit(1);
    if (signal(SIGALRM, traite_signaux)==SIG_ERR) exit(1);
    signal signifie que dorénavant, il faut exécuter traite_signaux au lieu du traitement par défaut pour le signal indiqué (SIGINT et SIGALRM).

    les signaux sont prédéterminés par le système.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Points : 48
    Points
    48
    Par défaut
    mais ces deux conditions traitent deux cas (erreurs) seulement non ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    signal(SIGINT, traite_signaux) dit au système d'exploitation* "la prochaine fois que mon processus reçoit un signal SIGINT, appelle la fonction traite_signaux au lieu de tuer le processus".
    La fonction retourne SIG_ERR si elle échoue.

    En clair, les if() signifient "si on échoue à enregistrer la fonction traite_signaux() pour le signal SIGINT, on quitte le programme".


    *attention, c'est une simplification aussi.

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

Discussions similaires

  1. Envoi de signaux comme sous linux ( kill(t_pid,integer) )
    Par Bleys dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 24/06/2008, 08h53
  2. [fonction alarm] : non déclenchée en C/linux
    Par kilou dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 10/10/2007, 13h21
  3. [YASM] Signaux Linux 32 vs 64bits ?
    Par EdoBvD dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 12/08/2007, 02h24
  4. Réponses: 3
    Dernier message: 29/12/2005, 15h43
  5. [INFO]Signaux Linux et Java
    Par el3gans dans le forum Général Java
    Réponses: 5
    Dernier message: 26/11/2004, 00h17

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