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

  FORUM HardWare.fr
  Programmation
  C

  C sous Unix => Signaux pour une Horloge

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C sous Unix => Signaux pour une Horloge

n°900995
niouts
Forums => Entre-Aide !!
Posté le 17-11-2004 à 18:59:36  profilanswer
 

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
mood
Publicité
Posté le 17-11-2004 à 18:59:36  profilanswer
 

n°901010
niouts
Forums =&gt; Entre-Aide !!
Posté le 17-11-2004 à 19:21:12  profilanswer
 

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

n°901021
cricri_
Posté le 17-11-2004 à 19:37:46  profilanswer
 

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

n°901034
Diody
Posté le 17-11-2004 à 19:59:17  profilanswer
 

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
n°901105
niouts
Forums =&gt; Entre-Aide !!
Posté le 17-11-2004 à 20:57:41  profilanswer
 

Citation :

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


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

n°901147
HelloWorld
Salut tout le monde!
Posté le 17-11-2004 à 21:13:21  profilanswer
 

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°901149
niouts
Forums =&gt; Entre-Aide !!
Posté le 17-11-2004 à 21:14:09  profilanswer
 

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

n°901159
niouts
Forums =&gt; Entre-Aide !!
Posté le 17-11-2004 à 21:18:47  profilanswer
 

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...

n°901163
Joel F
Real men use unique_ptr
Posté le 17-11-2004 à 21:21:01  profilanswer
 

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

n°901183
niouts
Forums =&gt; Entre-Aide !!
Posté le 17-11-2004 à 21:25:14  profilanswer
 

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


Message édité par niouts le 17-11-2004 à 21:28:49
mood
Publicité
Posté le 17-11-2004 à 21:25:14  profilanswer
 

n°901230
Sve@r
Posté le 17-11-2004 à 21:40:28  profilanswer
 

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.
n°901261
niouts
Forums =&gt; Entre-Aide !!
Posté le 17-11-2004 à 22:03:09  profilanswer
 

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:

n°901637
Sve@r
Posté le 18-11-2004 à 12:24:49  profilanswer
 

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 !!!


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

  C sous Unix => Signaux pour une Horloge

 

Sujets relatifs
Répartition de l'occupation disque UnixPHP sous unix comment faire un require sur un fichier en relatif
verifier une saisie clavier en shell unix[UNIX] suppression de fichiers suivant leur date
[UNIX] GREP - SEDhorloge donnant l'heure du serveur. meilleure méthode ?
Probleme de programmation unix et stdarg.hExecuter un script shell sur un serveur unix distant a partir de winNT
unix et javascripteeclipse 3.0 et CDT 2.0 et autre ide sous linux/unix.
Plus de sujets relatifs à : C sous Unix => Signaux pour une Horloge


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