Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1629 connectés 

  FORUM HardWare.fr
  Programmation
  C

  C sous unix => synchronisation avec les signaux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C sous unix => synchronisation avec les signaux

n°2209060
aminebeach
Posté le 03-11-2013 à 10:53:43  profilanswer
 

Bonjour  
voila j'ai un petit problème de programmation en C sous Unix...  
en effet, le prof de cours nous a donné la correction d'un exercice qui demandait d'afficher toutes les nombres de 1 à 100 de sorte que le fils affiche les nombres imapirs et le père affiche les nombres pairs.
J'ai fait un essai qui n'a pas marché d'abord :: le voici ::
 

Code :
  1. #include<unistd.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<sys/types.h>
  5. #include<sys/wait.h>
  6. #include<signal.h>
  7. #include<errno.h>
  8. int main()
  9. {
  10.     int i;
  11.     pid_t pid;
  12.     switch(pid=fork())
  13.     {
  14.         case -1:
  15.         perror("error:pas de creation de processus" );
  16.         break;
  17.         case 0:
  18.         /*ds le processus fils */
  19.         pid=getppid();
  20.         for(i=1;i<100;i=i+2)
  21.         {
  22.             printf("le fils imprime %i\n",i);
  23.             kill(pid,SIGUSR1);
  24.             printf("le fils en pause\n" );
  25.             pause();
  26.         }
  27.         break;
  28.         default:
  29.         /*ds le père */
  30.         for(i=2;i<100;i=i+2)
  31.         {
  32.             printf("le père en pause\n" );
  33.             pause();
  34.             printf("le père imprime %i\n",i);
  35.             kill(pid,SIGUSR1);
  36.         }
  37.     }
  38.     return 0;
  39. }


 
et après le professeur nous a donné la correction qui ne me semblait pas différente de ma solution.Sa solution marche mais la mienne non ::  
voici la solution du prof ::
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <signal.h>
  5. #include <unistd.h>
  6. int flag = 1;
  7. void handler(int sig) {flag = 0;}
  8. int main(void)
  9. {  pid_t pid;
  10.    int i;
  11. if (signal(SIGUSR1, handler) == SIG_ERR)
  12.    {  perror("signal" ); exit(1);
  13.    }
  14. if ((pid = fork()) == -1)
  15.    {  perror("fork" ); exit(1);
  16.    }
  17. if (pid == 0)
  18.    {  /* fils */
  19.       pid = getppid();
  20.       for (i = 1; i <= 100; i += 2)
  21.       {  printf("%d\n", i);
  22.          kill(pid, SIGUSR1);
  23.          if (flag) pause();
  24.          flag = 1;
  25.       }
  26.    }
  27.    else
  28.    {  /* père */
  29.       for (i = 2; i <= 100; i += 2)
  30.       {  if (flag) pause();
  31.          flag = 1;
  32.          printf("%d\n", i);
  33.          kill(pid, SIGUSR1);
  34.       }
  35.    }
  36. return 0;
  37. }


 
 
=> je voudrais juste savoir quelle est la différence et pourquoi la mienne n'a pas marché et celle du prof a marché,
merci

mood
Publicité
Posté le 03-11-2013 à 10:53:43  profilanswer
 

n°2209063
Farian
Posté le 03-11-2013 à 11:03:13  profilanswer
 

Bonjour !
 
La "man page" de pause indique que la fonctionne ne se termine que quand un signal a été intercepté (donc que vous avez installé un handler et que celui-ci s'est terminé). Comme vous n'installez pas de handler sur SIGUSR1 ...
 
De plus, la gestion de la variable "flag" permet de se prémunir contre une arrivée trop rapide du signal de l'autre processus, avant que l'appel à la fonction pause n'ait eu lieu, ce qui bloquerait un processus dans l'appel suivant, et donc l'autre aussi, mécaniquement.
 
Bonne continuation !

n°2209067
aminebeach
Posté le 03-11-2013 à 12:21:21  profilanswer
 

Merci bcp Farian,  
Tu avais raison , il fallait utiliser le handler .
je voudrais juste envisager le cas suivant :
on entre d'abord dans le processus fils , on imprime 1 et on fait un kill pour envoyer SIGUSR1 au père, ce dernier n'a pas encore exécuté la pause() ; par conséquent, il n'attrappe pas le signal et on aboutit à un bloquage.
est-ce qu'il y'a de fautes dans mon raisonnement ? :: merci infiniment

n°2209106
Farian
Posté le 03-11-2013 à 22:05:37  profilanswer
 

C'est pour cela qu'il y a la variable "flag", dans chaque process, qui permet de savoir si le handler a déjà été appelé pour ce pas de boucle ou non, sinon, en effet, on peut arriver à un blocage des deux threads.
 
Bonne continuation !

n°2209115
aminebeach
Posté le 04-11-2013 à 01:34:17  profilanswer
 

Merci infiniment à vous !!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  C sous unix => synchronisation avec les signaux

 

Sujets relatifs
envoyer tout un vecteur comme un paramètre de Java en C + +Aide Programmation en C
Structure Polynome( probleme d'affichage) en C[C] Besoin d'aide pour le Jeux de la Vie
mini serveur en C: setsockopt() == -1Langage C - Pointeurs (Quelques explications)
[C] Comment sauvegarder lors d'un remplissage de fichier?Inversion de matrices en C
[C=débutant] Boucle WhileDébutant en C...
Plus de sujets relatifs à : C sous unix => synchronisation avec les signaux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR