C sous Unix => Signaux pour une Horloge

C sous Unix => Signaux pour une Horloge - C - Programmation

Marsh Posté le 17-11-2004 à 18:59:36    

Bonsoir,
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 de simuler une horloge en utilisant 3 processus (pere, fils et fils du fils), un qui gère les secondes, un qui gère les minutes et un les heures !
mais le problème c'est que lorsque je compile, il n'y a aucune erreur mais lorsque j'execute, il m'ecrit l'heure de depart (c'est OK), puis la seconde qui suit mais c'est tout...
 

Code :
  1. #include<stdio.h>
  2. #include<signal.h>
  3. #include<sys/time.h>
  4. #include<unistd.h>
  5. #include<stdlib.h>
  6. static int s,m,h,pid,pid2;
  7. void Fonction_Seconde ()
  8. {s++;
  9. if (s==60)
  10.     {s=0;
  11.      kill(pid,SIGUSR1);
  12.     }
  13. printf("%2d Seconde(s)\n",s); 
  14. }
  15. void Fonction_Minute ()
  16. {m++;
  17. if (m==60)
  18.     {m=0;
  19.      kill(pid2,SIGUSR1);
  20.     }
  21. printf("%2d Minute(s) ",m); 
  22. }
  23. void Fonction_Heure ()
  24. {h++;
  25. if (h==24)
  26.     h=0;
  27. printf("%2d Heure(s) ",h); 
  28. }
  29. int main (int argc, char *argv[])
  30. {s=0;m=0;h=0;
  31. printf("%2d Heure(s) %2d Minute(s) %2d Seconde(s)\n",h,m,s); 
  32. if ((pid=fork())<0)
  33.           {perror("Erreur dans le Fork() !\n" );
  34.            exit(1);
  35.   }
  36. if (pid>0)      {signal(SIGALRM,Fonction_Seconde);
  37.      alarm(1);
  38.      for(;;);       
  39.     }  
  40. else {if ((pid2=fork())<0)
  41.         {perror("Erreur dans le Fork() !\n" );
  42.                  exit(1);
  43.  }
  44. if (pid2>0)
  45.    {signal(SIGUSR1,Fonction_Minute);
  46.     for(;;);
  47.    }
  48. else { signal(SIGUSR1,Fonction_Heure);
  49.        for(;;);
  50.       } 
  51.        }
  52. return 0;
  53. }


 
 :bounce:  
Merci d'avance à celui ou celle (ou ceux  :D  ) qui s'auront et voudront m'aider... :sol:


Message édité par niouts le 17-11-2004 à 21:24:50
Reply

Marsh Posté le 17-11-2004 à 18:59:36   

Reply

Marsh Posté le 17-11-2004 à 19:21:12    

Dsl pour les smileys qui se sont insérés involontairement...
donc vous avez compris je suppose c'est a remplacer par "for ( ; ; ) ;"

Reply

Marsh Posté le 17-11-2004 à 19:37:46    

Faut utiliser les balises de codes, ré-édite ...

Reply

Marsh Posté le 17-11-2004 à 19:59:17    

euh, essaie de relire le code une fois au moins ...
 
La premiere fois c'est normal vu que tu fais un printf au début
La dexieme fois, ca met à jour qu'une fois vu que tu recois le sigalrm après une seconde.  
Puis y se passe plus rien c'est normal aussi, comment veux tu qu'il se passe qqu chose d'autre ?  :??:


Message édité par Diody le 17-11-2004 à 20:11:33
Reply

Marsh Posté le 17-11-2004 à 20:57:41    

Citation :

Faut utiliser les balises de codes, ré-édite ...


 
Désolé mais c'est quoi ca ??

Reply

Marsh Posté le 17-11-2004 à 21:13:21    

[ cpp ]ton code[ / cpp ] (sans les espaces off course)
T'as un bouton pour modifier tes messages.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-11-2004 à 21:14:09    

Est-ce-que quelqu'un pourrait me dire ce que je dois changer dans ce code pour que ca marche ?? ;)
Merci !

Reply

Marsh Posté le 17-11-2004 à 21:18:47    

Je suis vraiment désolé mais je ne comprend rien a ce que vous me racontez tous les 2 avec les balises...
alors il y a 2 possibilités : soit c'est pour le sujet dans ce cas je vois pas pourquoi je changerai en mettant que c'est du C++ puisque c'est du C...soit c'est pour me dire d'inclure des balises dans mon code et la ben je ne vois pas trop comment :)
Enfin Merci de m'expliquer car c'est peut etre car le soir approche mais la j'ai du mal a tout saisir...

Reply

Marsh Posté le 17-11-2004 à 21:21:01    

edit ton premier poste, remplace tes [citation] par [cpp]

Reply

Marsh Posté le 17-11-2004 à 21:25:14    

Merci !
Quelqu'un saurait maintenant répondre à ma question ?


Message édité par niouts le 17-11-2004 à 21:28:49
Reply

Marsh Posté le 17-11-2004 à 21:25:14   

Reply

Marsh Posté le 17-11-2004 à 21:40:28    

Niouts a écrit :

Est-ce-que quelqu'un pourrait me dire ce que je dois changer dans ce code pour que ca marche ?? ;)
Merci !


 
Si je lis bien ton pgm, tu as une fonction "seconde" qui est activée par le signal "SIGALRM". Qd cette fonction atteint "60", elle envoie un "SIGUSR1" à un autre processus qui active à ce moment la fonction "minute". Idem, qd cette fonction atteint "60" elle envoie un "SIGUSR1" à un 3° processus qui active à ce moment la fonction "heure".
Une fois la chaîne établie, le processus qui gère les secondes met en place un lancement du signal "SIGALRM" qui sera exécuté au bout de 1 seconde ce qui activera la fonction "seconde" et débutera la chaîne.
 
Le pb, c'est que cette fonction "seconde" n'est activée qu'une seule fois lorsque le signal "SIGALRM" est reçu !!!
Il faut que la fonction "seconde" refasse un "alarm(1)" pour que la fonction soit de nouveau réactivée la seconde suivante !!!
 
De plus, il est possible que le signal ne soit trappé qu'une fois (dans certains Unix, c'est le comportement standard). Donc il est possible que tu sois obligé, dans chaque fonction "seconde", "minute" et "heure" de refaire un "signal()" pour réarmer la gestion du signal.
 
Enfin le standard veut qu'une fonction lancée lors dela réception d'un signal soit impérativement de type "void" et reçoive un "int". Ce "int" contient le signal reçu.
 
Grosso-modo, voilà le code que moi je mettrais...

Code :
  1. #include<stdio.h>
  2. #include<signal.h>
  3. #include<sys/time.h>
  4. #include<unistd.h>
  5. #include<stdlib.h>
  6. static int s,m,h,pid,pid2;
  7. void Fonction_Seconde (int sig)
  8. {
  9.   signal(sig, Fonction_Seconde);
  10.   alarm(1);
  11.   s++;
  12.   if (s==60)
  13.   {
  14.      s=0;
  15.      kill(pid,SIGUSR1);
  16.   } 
  17.   printf("%2d Seconde(s)\n",s);   
  18. }
  19. void Fonction_Minute (int sig)
  20. {
  21.   signal(sig, Fonction_Minute);
  22.   m++;
  23.   if (m==60)
  24.   {
  25.      m=0;
  26.      kill(pid2,SIGUSR1);
  27.   }
  28.   printf("%2d Minute(s) ",m); 
  29. }
  30. void Fonction_Heure (int sig)
  31. {
  32.    signal(sig, Fonction_Heure);
  33.    h++;
  34.    if (h==24)
  35.      h=0;
  36.    printf("%2d Heure(s) ",h);   
  37. }
  38. int main (int argc, char *argv[]) 
  39. {
  40.    s=0;m=0;h=0;
  41.    printf("%2d Heure(s) %2d Minute(s) %2d Seconde(s)\n",h,m,s);   
  42.    if ((pid=fork())<0) 
  43.    {
  44.        perror("Erreur dans le Fork() !\n" );
  45.        exit(1);
  46.    }
  47.    if (pid>0)
  48.    {
  49.        signal(SIGALRM, Fonction_Seconde);
  50.        alarm(1);
  51.        while(1);
  52.    }   
  53.    else
  54.    {
  55.        if ((pid2=fork())<0)
  56.        {
  57.            perror("Erreur dans le Fork() !\n" );
  58.            exit(1);
  59.        }
  60.        if (pid2>0) 
  61.        {
  62.            signal(SIGUSR1,Fonction_Minute);
  63.            while (1);
  64.        }
  65.        else
  66.        {
  67.            signal(SIGUSR1,Fonction_Heure);
  68.            while (1);
  69.        }
  70.   }
  71.   return 0;
  72. }


 
Ce code n'est pas parfait, loin s'en faut. Moi, par exemple, j'aurais fait gérer les secondes par le petit-fils, les minutes par le fils et les heures par le père (hiérarchie plus logique de mon point de vue). De plus, le second "perror" si le second "fork" ne fonctionne pas ne fait que tuer le fils alors que le père reste en vie => pas propre !!!
Néanmoins le code devrait quand-même fonctionner correctement...


Message édité par Sve@r le 17-11-2004 à 21:42:38

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 17-11-2004 à 22:03:09    

Alors,
Cela marche très bien enfin pas tout à fait non je m'explique  :??: :
toutes les secondes il y a bien un affichage des secondes comme il doit etre fait mais le problème c'est que lorsque les secondes arrivent à 60 il affiche "0" (logique) mais les minutes ne sont pas incrémentées...
voila enfin  
sinon merci c'est déjà très bien, car au moins je suis debloqué !  :bounce:

Reply

Marsh Posté le 18-11-2004 à 12:24:49    

Niouts a écrit :

Alors,
Cela marche très bien enfin pas tout à fait non je m'explique  :??: :
toutes les secondes il y a bien un affichage des secondes comme il doit etre fait mais le problème c'est que lorsque les secondes arrivent à 60 il affiche "0" (logique) mais les minutes ne sont pas incrémentées...
voila enfin  
sinon merci c'est déjà très bien, car au moins je suis debloqué !  :bounce:


 
En fait, il fonctionne très bien mais il n'affiche pas les minutes ni les heures
C'est parce que le "printf" met ses sorties dans une mémoire tampon et ne vide ses tampons que dans 4 cas
1) il rencontre le caractère '\n'
2) il reçoit un ordre de vider les tampons "fflush"
3) le tampon est plein
4) le processus dans lequel le tampon est stocké se termine "exit"
 
Si tu veux que tes minutes et heures s'affichent au moment où "printf" est appelé, soit tu mets un '\n' dans la chaîne style

Code :
  1. printf("%2d minute(s)\n", m);


soit tu demandes un vidage "fflush" style

Code :
  1. printf("%2d minute(s)", m);
  2. fflush(stdout);


 
Et là, ça fonctionnera !!!

Reply

Sujets relatifs:

Leave a Replay

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