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 :

Programmation système: question sur les signaux.


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Programmation système: question sur les signaux.
    Salut tout le monde,

    J'ai une question sur la programmation système sous linux et notamment avec l'utilisation des signaux.
    Je voudrais savoir s'il était possible de créer un programme qui se duplique - grâce la fonction fork - et dont le processus père envoie un signal - avec la fonction kill - au processus fils et dont celui-ci le traite, notamment grâce à la fonction sigaction ?

    J'aimerais savoir si le code suivant est correct :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <signal.h>
     
    void handler(int signum)
    {
       fprintf(stdout, "Signal recu : %d\n", signum) ;
    }
     
    int main(int argc, char *argv[])
    {
       pid_t child = fork() ;
     
       if (child == -1)
       {
          perror("fork") ;
          fprintf(stderr, "file: %s, line: %s\n", __FILE__, __LINE__) ;
          exit(EXIT_FAILURE) ;
       }
     
       if (child == 0)
       {
          struct sigaction act ;
     
          sigemptyset(&(act.sa_mask)) ;
          act.sa_handler = handler ;
          act.sa_flags = 0 ;
     
          sigaction(SIGUSR2, &act, NULL) ;
     
          exit(EXIT_SUCCESS) ;
       }
     
       kill(child, SIGUSR2) ;
     
       wait(NULL) ;
     
       return 0 ;
    }
    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Salut
    Perso je ne connais pas sigaction() mais si j'avais programmé le même genre de code en passant par signal(), j'aurais fait pareil. Activation du signal dans le fils et envoi du kill() par le père.
    Surtout que tu peux remplacer tout ton blog sigaction() par un simple signal(SIGUSR2, handler).

    Accessoirement tu peux rajouter un petit sleep(1) au début du père pour être certain que le fils passe en premier et puisse activer son sigaction() avant que le kill() ne parte ; et utiliser strerror(errno) dans ton fprintf() pour éviter le perror() qui fait doublon.

  3. #3
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Salut Sve@r,

    Merci pour ton aide.

    J'utilise la fonction sigaction car c'est ce que j'ai vu en cours et j'essaie de l'appliquer.
    Merci pour la remarque sur strerror, j'y ai pas pensé.
    Pour finir même en remplaçant sigaction par signal cela ne fonctionne pas, par contre envoyer un signal du fils au père, celui-ci le capte bien.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Kra7os Voir le message
    Pour finir même en remplaçant sigaction par signal cela ne fonctionne pas
    Ouais, c'est normal, même moi j'ai galéré 5mn avant de comprendre (et en plus c'est pas la première fois et c'est ça qui me gonfle le plus !!!)

    En fait, ton fils s'exécute puis se termine par un exit(). Et donc n'a pas le temps d'intercepter le signal.

    En revanche, ce code-ci fonctionne très bien
    Code c : 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
    #include <signal.h>
     
    void handler(int signum)
    {
       fprintf(stdout, "Signal recu : %d\n", signum) ;
       exit(EXIT_SUCCESS) ;     // Fin du fils ici
    }
     
    int main(int argc, char *argv[])
    {
       pid_t child = fork() ;
     
       if (child == -1)
       {
          perror("fork") ;
          fprintf(stderr, "file: %s, line: %s\n", __FILE__, __LINE__) ;
          exit(EXIT_FAILURE) ;
       }
     
       if (child == 0)
       {
          signal(SIGUSR2, handler);
          while(1);     // Faut pas que le fils meure !!!
       }
     
       sleep(1); 
       kill(child, SIGUSR2) ;
       wait(NULL) ;
     
       return 0 ;
    }

    Citation Envoyé par Kra7os Voir le message
    , par contre envoyé un signal du fils au père, celui-ci le capte bien.
    Même raison (mais dans l'autre sens): le père attendant la fin du fils lors du wait() ne meurt donc pas et a donc, lui, le temps et l'occasion de recevoir et intercepter le signal...

  5. #5
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Écoute c'était bien ça le problème, tout marche nickel.

    Merci beaucoup Sve@r !

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

Discussions similaires

  1. [QtCore] Quelques questions sur les signaux et les slots
    Par simastion dans le forum PyQt
    Réponses: 13
    Dernier message: 09/01/2011, 14h20
  2. Questions sur les signaux
    Par syl1405 dans le forum C
    Réponses: 12
    Dernier message: 03/08/2010, 13h58
  3. Réponses: 0
    Dernier message: 21/06/2009, 22h06
  4. [IA] Question sur les systèmes intélligents
    Par acacia dans le forum Intelligence artificielle
    Réponses: 2
    Dernier message: 20/01/2008, 19h25
  5. [Système] 2 questions sur les chaines de charctères
    Par prologO dans le forum Langage
    Réponses: 15
    Dernier message: 22/10/2006, 16h53

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