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

C Discussion :

philosophie: expliquez-moi ce que veut dire signal()


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Points : 110
    Points
    110
    Par défaut philosophie: expliquez-moi ce que veut dire signal()
    Salut,

    je suis en train d'utiliser d'intercepter des signaux dans un programme via la fonction signal (de signal.h). J'ai compris son utilité (et son utilisation), mais je ne comprends pas vraiment sa syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void (*signal(int sig, void (*func)(int)))(int)
    J'ai mon idée sur le sujet, mais je suis incapable de l'exprimer en prose (ni en vers ). En gros, ce que je comprends c'est:
    -> signal(int sig, void (*func)(int))) : signal prend comme paramètre un int "sig" et une fonction de type void (qui prend à son tour un int): on met le * devant func, car les fonctions sont en fait des adresses, juste ?
    -> void (*signal(...))(int)

    Ca, je comprends pas trop par contre: je ne comprends pas ce que vient faire le (int) à la fin, ni même le pointeur devant signal...





    Merci

  2. #2
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <signal.h>
    typedef void (*sighandler_t)(int);
    sighandler_t signal(int signum, sighandler_t handler);
    La fonction signal permet d'installer un gestionnaire pour un signal donné. Elle retourne l'ancien gestionnaire (pointeur sur fonction) s'il y en avait un installé précédemment.
    Lorsque le signal en question (de numéro signum) est reçu par ton programme, la fonction handler est appelée pour gérer ce signal.
    Cette fonction prend un int en paramètre. Je crois me souvenir qu'il s'agit du numéro du signal, mais il faudrait vérifier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*signal(int sig, void (*func)(int)))(int)
    La syntaxe dont tu parles permet de définir un pointeur sur une fonction prenant un entier en paramètre et ne retournant rien.
    Tu trouveras sans doute plus d'informations ici : http://emmanuel-delahaye.developpez.com/notes.htm (cherches "pointeur de fonction").

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    void (*signal(int sig, void (*func)(int)))(int)
    Ca, je comprends pas trop par contre: je ne comprends pas ce que vient faire le (int) à la fin, ni même le pointeur devant signal...
    Ceci exprime que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (*signal(int sig, void (*func)(int)))
    est une fonction, ayant un paramètre int, retournant void .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    signal(int sig, void (*func)(int))
    est une fonction retournant un pointeur sur une fonction (ayant un paramètre int et retournant void) ayant comme paramètre un int et un pointeur sur fonction (ayant un paramètre int et retournant void)
    La parenthèse devant *est nécessaire, sinon, on comprendrait que signal est une fonction renvoyant un pointeur sur void

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    merci pour vos réponse... mais finalement, que veut dire le dernier (int) ?

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par bulki
    merci pour vos réponse... mais finalement, que veut dire le dernier (int) ?
    Si signal renvoie un pointeur sur une fonction, cette fonction à forcemment un prototype. Dans notre cas, le prototype ressemble a ceci :
    Donc, ton "int" correspond au "int" qui est en paramètre de "myfunc".

  6. #6
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par crocodilex
    Si signal renvoie un pointeur sur une fonction, cette fonction à forcemment un prototype. Dans notre cas, le prototype ressemble a ceci :
    Donc, ton "int" correspond au "int" qui est en paramètre de "myfunc".
    Oui, signal() prend en paramètre et renvoie un pointeur sur une fonction qui a le prototype donné par crocodilex.

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    merci pour vos réponse... mais finalement, que veut dire le dernier (int) ?
    Ce dernier int signifie que signal renvoie un pointeur (présence de *) sur une fonction ayant un paramètre int

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 581
    Points
    41 581
    Par défaut
    En fait, signal() est la fonction qui possède le prototype le plus pourri de tout le standard, pour la simple bonne raison que le standard utilise des typedefs partout, sauf là où c'est le plus utile.

    Décomposons la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*signal(int sig, void (*func)(int)))(int);
    En utilisant un typedef, ça fait tout de suite à la fois plus simple et plus propre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* typedef de pointeur de fonction */
    typedef void (*sig_t)(int);
    /* fonction signal() */
    sig_t signal(int sig, sig_t func);
    Ici, on voit directement que la fonction signal() prend en paramètre un entier et un pointeur de fonction, et retourne un pointeur de fonction.

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    En fait, signal() est la fonction qui possède le prototype le plus pourri de tout le standard, pour la simple bonne raison que le standard utilise des typedefs partout, sauf là où c'est le plus utile.
    +1

    Une implémentation plus lisible a été donnée par zooro.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Oui, c'est moi qui n'ai pas les yeux en face des trous pour ne pas l'avoir vu.

    (note: sig_t est le typedef employé par FreeBSD)

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Points : 110
    Points
    110
    Par défaut
    génial, j'ai compris. Merci BEAUCOUP

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

Discussions similaires

  1. que veut dire avoir un salaire sur 14 mois ?
    Par clavier12AZQSWX dans le forum Salaires
    Réponses: 12
    Dernier message: 22/05/2018, 12h06
  2. que veut dire (nrow >= 6) && (~nrow&0x01)
    Par gronaze dans le forum C
    Réponses: 12
    Dernier message: 24/03/2006, 15h00
  3. [WD9] Que veut dire AGL?
    Par afrikha dans le forum WinDev
    Réponses: 4
    Dernier message: 24/10/2005, 11h15
  4. Que veut dire ce symbole?
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 24/06/2005, 22h25
  5. Que veut dire "volatile" devant une variable ?
    Par altahir007 dans le forum C
    Réponses: 4
    Dernier message: 23/06/2004, 15h47

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