C sous unix => synchronisation avec les signaux

C sous unix => synchronisation avec les signaux - C - Programmation

Marsh Posté le 03-11-2013 à 10:53:43    

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

Reply

Marsh Posté le 03-11-2013 à 10:53:43   

Reply

Marsh Posté le 03-11-2013 à 11:03:13    

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 !

Reply

Marsh Posté le 03-11-2013 à 12:21:21    

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

Reply

Marsh Posté le 03-11-2013 à 22:05:37    

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 !

Reply

Marsh Posté le 04-11-2013 à 01:34:17    

Merci infiniment à vous !!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed