Question sur handler
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Question sur handler



  1. #1
    inviteed786115

    Question sur handler


    ------

    Bonjour,
    Quelqu’un pourrait m'aider à comprendre qu'est-ce qu'elle fait la fonction que j'ai mise en couleur dans le programme suivant ? Pour quoi on a pu mettre la fonction handler dans signal qui se trouve dans la fonction handler elle-même? pour quoi on a mis i comme paramètre de la fonction handler alors qu'on ne l'utilise pas dans la fonction ?
    Merci pour vos avis éclairés

    Code:
    #include <stdio.h>
    #include <ctype.h>
    #include <fcntl.h>
    #include <signal.h>
    
    #define NFILS 25
    
    int p[2];
    int n=10;
    char c[10];
    char s;
    
    void handler (int i)
    {
     signal (SIGUSR1,handler);
     read (p[0],&s,1);
    }
    
    
    main ()
    {
    
     int pid[NFILS];
     int i;
     
     pipe (p);
    
    
     for (i=0;i<NFILS;i++){  
       switch (pid [i]=fork()) {
       case -1 : perror ("Erreur de creation");
       		exit (0);
       case 0 : /*Fils i*/
    	 signal (SIGUSR1,handler);
    	 sprintf (c,"%010d",getpid());
    	 write (p[1],c,10);
    	 pause ();
    	 printf ("Fils %3d ok (%c) \n",i,s);
    	 exit (0);
       default : /* Pere */
    	 read (p[0],c,10);
    	 printf ("pere - passage %3d, apres creation de : %5d (%10s)...",i,pid [i],c);
    	 if (atoi(c) == pid [i]) {printf ("ok\n");}
    	 break ;
       }
     }
     
     printf ("Tous les fils sont lances ! (%d)\n",getpid());
     write (p[1],"abcdefghijklmnopqrstABCDEFGHIJKLMNOPQRST",NFILS);
     for (i=0;i<NFILS;i++) kill (pid[i],SIGUSR1);
    kill (pid[0],SIGUSR1); 
    }

    -----

  2. #2
    invite4492c379

    Re : Question sur handler

    Salut,

    sous unix tu peux envoyer des signaux aux processus via la commande kill par exemple. L'un de ces signaux est SIGUSR1. fork permet de dupliquer un processus.

    Donc dans un premier temps, ton programme crée NFILS processus, chacun de ces processus dès réception du signal SIGUSR1 passera la main au handler handler.
    Après leur création, le père envoie à chaque fils le signal SIGUSR1. Normalement le prototype d'un handler de signal est void (*handler)(void) , mais cela dépend aussi de la plateforme.

    Sinon, ce que fait le handler en lui-même, c'est simple : par souci de compatibilité avec certains système il se réinstalle lui-même, ensuite il lit le pipe (structure pour la communication interprocessus) et value la variable globale s.

    Cet exemple permet entre de voir comment fonctionne un fork (méthode primitive pour faire des threads en quelquesorte), où est le code du père, des fils ; ce qui est partagé entre les deux, ce qui est local à chacun ...

  3. #3
    invite4492c379

    Re : Question sur handler

    Petite rectification, je viens de checker la doc de glibc :

    sighandler_t

    This is the type of signal handler functions. Signal handlers take one integer argument
    specifying the signal number, and have return type void. So, you should define
    handler functions like this:
    void handler (int signum) { ... }
    The name sighandler_t for this data type is a GNU extension.
    Le paramètre passé est le numéro du signal déclencheur, ce qui permet évidemment d'avoir un handler pour plusieurs signaux.

  4. #4
    inviteed786115

    Re : Question sur handler

    merci milles fois à photon57. Selon ce que vous avez dit, j'ai désactivé la ligne signal (SIGUSR1,handler); dans la fonction handler et après exécution de ce programme, ça donne le même résultat que quand la ligne de code n'est pas désactivée, je pourrait dire qu'il n'y a pas de soucis d'incompatibilité avec le système dans ce cas là ?

  5. A voir en vidéo sur Futura
  6. #5
    invite4492c379

    Re : Question sur handler

    Citation Envoyé par wintercold Voir le message
    merci milles fois à photon57. Selon ce que vous avez dit, j'ai désactivé la ligne signal (SIGUSR1,handler); dans la fonction handler et après exécution de ce programme, ça donne le même résultat que quand la ligne de code n'est pas désactivée, je pourrait dire qu'il n'y a pas de soucis d'incompatibilité avec le système dans ce cas là ?
    Hello,
    je suppose (car cela fonctionne toujours) que tu l'as désactivé dans le handler. Si ça fonctionne il n'y aura pas de problème sur l'OS que tu utilises (mais sur certaines version d'unix cela ne fonctionnera plus).

  7. #6
    inviteed786115

    Re : Question sur handler

    tout est claire, problème résolu. Merci encore une fois photon57 et très bonne journée à vous.

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/10/2010, 20h40
  2. Réponses: 3
    Dernier message: 10/09/2009, 22h25
  3. Ptite question sur une question de géo3D : Asie 06
    Par invitefc60305c dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 01/06/2007, 13h51
  4. Question sur une question ( algèbre lin.)
    Par invite2dc206d9 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 13/10/2006, 23h39
  5. Question sur VCO dans ce schéma (et autre question)
    Par invite96a93ba8 dans le forum Électronique
    Réponses: 0
    Dernier message: 08/12/2005, 22h01