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 :

synchronisation des processus a l'aide des signaux


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 1
    Par défaut synchronisation des processus a l'aide des signaux
    slt, mon probleme est d'afficher les entiers de 1 à 100 avec le processus pere affiche les pairs et le processus fils affiche les impairs.
    voici mon code:
    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 <sys/types.h>
    #include <signal.h>
    #include <unistd.h>
     
     
    void handler(int sig) {}
     
     
    int main(void)
    {  pid_t pid;
       int i;
     
       if (signal(SIGUSR1, handler) == SIG_ERR)
       {  perror("signal"); exit(1);
       }
       if ((pid = fork()) == -1)
       {  perror("fork"); exit(1);
       }
     
       if (pid == 0)
       {  /* fils */
          pid = getppid();
          for (i = 1; i <= 100; i += 2)
          {  printf("%d\n", i);
             kill(pid, SIGUSR1);
    	 pause();
          }
       }
       else
       {  /* père */
          for (i = 2; i <= 100; i += 2)
          {  
             printf("%d\n", i);
            kill(pid, SIGUSR1);
    	pause();
     
          }
       }
     
       return 0;
    }

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Je ne vois pas à quoi sert la fonction "handler" dans ton code. D'ailleurs je ne vois même pas où est-ce que tu as un problème... mis à part que tes 2 processus ne seront absolument pas synchronisés.
    Si tu veux une synchro alors il te faut un handler pour le père et un handler pour le fils. Le handler pour le père affiche un chiffre et envoie au fils un signal qui est récupéré dans le fils par son handler. Il affiche aussi un chiffre et renvoie au père un signal récupéré par son handler. Et chaque handler incrémente le chiffre affiché etc etc.

    Quand j'étais prof, j'avais pondu un exo similaire qui se nommait "pingpong". Voici le code. Tu peux l'adapter à ton cas c'est pas très difficile...
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #include <stdio.h>
    #include <signal.h>
    #include <errno.h>
     
    #define SIGPERE				(SIGUSR1)		/* Signal utilisé par le père     */
    #define SIGFILS				(SIGUSR2)		/* Signal utilisé par le fils     */
     
    static void pere(int);						/* Lancée par le père             */
    static void fils(int);						/* Lancée par le fils             */
     
    int pid;									/* No process fils                */
     
    extern const char* const sys_errlist[];		/* Liste messages erreurs         */
     
    /* Fonction principale */
    int main()
    {
    	/* Déclaration des variables */
    	extern int pid;							/* No process fils (globale)      */
     
    	/* Création fils */
    	switch(pid=fork())
    	{
    		case (-1): /* Erreur */
    			fprintf(stderr, "ligne %u - fork() - %s\n", __LINE__, sys_errlist[errno]); 
    			exit(errno);
     
    		case(0): /* Fils */
    			/* Positionnement du détournement de signal */
    			signal(SIGFILS, fils);
     
    			/* Le process ne doit pas s'arrêter */
    			while(1);
    			break;
     
    		default:
    			printf("Fils : %u lançé...\n", pid);
     
    			/* Positionnement du détournement de signal */
    			signal(SIGPERE, pere);
     
    			/* Tempo création fils */
    			sleep(1);
     
    			/* Envoi signal du départ à moi-meme */
    			kill(getpid(), SIGPERE);
     
    			/* Le process ne doit pas s'arrêter */
    			while(1);
    	}
    }
     
    /* Fonction lançée par le père */
    static void pere(
    	int sig)								/* Signal reçu                    */
    {
    	/* Déclaration des variables */
    	extern int pid;							/* No process fils (globale)      */
     
    	/* Repositionnement du detournement du signal */
    	signal(sig, pere);
     
    	/* Affichage d'un signal quelconque */
    	printf("Père(%u) - Reçu %u - Envoi %u à mon fils\n", getpid(), sig, SIGFILS);
     
    	/* Tempo affichage */
    	sleep(1);
     
    	/* Envoi du signal au fils */
    	kill(pid, SIGFILS);
    }
     
    /* Fonction lançée par le fils */
    static void fils(
    	int sig)								/* Signal reçu                    */
    {
    	/* Déclaration des variables */
    	/* Pas de variable */
     
    	/* Repositionnement du détournement du signal */
    	signal(sig, fils);
     
    	/* Affichage d'un signal quelconque */
    	printf("\tFils(%u) - Reçu %u - Envoi %u à mon père\n", getpid(), sig, SIGPERE);
     
    	/* Tempo affichage */
    	sleep(1);
     
    	/* Envoi du signal au pere */
    	kill(getppid(), SIGPERE);
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. je cherche des tutoriels sur la gestion des processus en C++, merci
    Par phenix1988 dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 02/03/2009, 10h44
  2. synchronisation des threads a l'aide des moniteurs
    Par rdakpapdak dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 10/04/2008, 17h30
  3. Réponses: 4
    Dernier message: 16/10/2007, 16h56

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