SHARE
TWEET

Untitled

a guest Mar 26th, 2020 62 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdarg.h>
  5. #include <stdio.h>
  6. #include <time.h>
  7. #include <signal.h>
  8. #include <sys/wait.h>
  9. #include "table.h"
  10. /** Version minimale de la fonction sauve qui peut.
  11.  
  12.     Appeler cette fonction n'a de sens qu'après un appel système qui a
  13.     échoué (puisqu'elle appelle perror()).
  14.  
  15.     \param[in] msg Une chaîne de caractère passée à perror()
  16. */
  17. void raler (const char * msg)
  18. {
  19.     perror (msg);
  20.     exit (EXIT_FAILURE);
  21. }
  22. /** Une fonction que vous pouvez utiliser comme printf pour afficher
  23.     une ligne précédée du numéro de processus et des minute/seconde.
  24. */
  25. #ifdef __GNUC__
  26. __attribute__ ((format (printf, 1, 2)))
  27. #endif
  28. void chronos_log (const char * fmt, ...)
  29. {
  30.     va_list ap;
  31.     va_start (ap, fmt);
  32.     time_t t = time (NULL);
  33.     struct tm * tm = localtime (&t);
  34.     fprintf (stderr, "[%d @ %02d:%02d] ",
  35.              getpid(), tm->tm_min, tm->tm_sec);
  36.     vfprintf (stderr, fmt, ap);
  37.     fflush (stderr);
  38.     va_end (ap);
  39. }
  40.  
  41. volatile sig_atomic_t continuer=1;
  42. volatile sig_atomic_t afficher=1;
  43.  
  44. volatile sig_atomic_t recu_usr2=0;
  45. volatile sig_atomic_t recu_usr1=0;
  46. volatile sig_atomic_t recu_term=0;
  47. volatile sig_atomic_t recu_alarm=0;
  48. //volatile sig_atomic_t recu_child=0;
  49.  
  50. void affiche (int sig)
  51. {
  52.     (void)sig;
  53.     recu_usr2=1;
  54.     return;
  55. }
  56.  
  57. void active_affichage(int sig)
  58. {
  59.     (void) sig;
  60.     return;
  61. }
  62.  
  63. void stop (int sig)
  64. {
  65.     (void)sig;
  66.     recu_term=1;
  67.     return;
  68.  
  69. }
  70. void alarme (int sig)
  71. {
  72.     (void)sig;
  73.     recu_alarm=1;
  74.     return;
  75.  
  76. }
  77.  
  78. /*void child (int sig)
  79. {
  80.     (void)sig;
  81.     recu_child=1;
  82.     return;
  83.  
  84. }*/
  85.  
  86.  
  87. void chronos (char* table)
  88. {
  89.     FILE*fd;
  90.     if((fd=fopen(table,"r")) == NULL)
  91.         raler("Impossible d 'ouvrir le fichier");
  92.  
  93.     struct table * tbl=table_parse(fd);
  94.    
  95.     if(fclose(fd) == EOF)
  96.         raler("Fermeture du fichier");
  97.  
  98.     struct sigaction s;
  99.     s.sa_flags=0;
  100.     s.sa_handler=affiche;
  101.     sigemptyset(&s.sa_mask);
  102.     sigset_t vide, masque;
  103.     sigemptyset(&vide);
  104.     sigemptyset(&masque);
  105.    
  106.  
  107.     struct sigaction s1;
  108.     s1.sa_flags=0;
  109.     s1.sa_handler=active_affichage;
  110.     sigemptyset(&s1.sa_mask);
  111.  
  112.     struct sigaction sterm;
  113.     sterm.sa_flags=0;
  114.     sterm.sa_handler=stop;
  115.     sigemptyset(&sterm.sa_mask);
  116.  
  117.     struct sigaction salarm;
  118.     sterm.sa_flags=0;
  119.     sterm.sa_handler=alarme;
  120.     sigemptyset(&salarm.sa_mask);
  121.  
  122.    /* struct sigaction schld;
  123.     schld.sa_flags=0;
  124.     schld.sa_handler=child;
  125.     sigemptyset(&schld.sa_mask);*/
  126.  
  127.     sigaction(SIGUSR2,&s,NULL);
  128.     sigaction(SIGUSR1,&s1,NULL);
  129.     sigaction(SIGTERM,&sterm,NULL);
  130.     sigaction(SIGALRM,&sterm,NULL);
  131.  
  132.     sigaddset(&masque,SIGUSR2);
  133.     sigaddset(&masque,SIGUSR1);
  134.     sigaddset(&masque,SIGTERM);
  135.     sigaddset(&masque,SIGCHLD);
  136.     sigaddset(&masque,SIGALRM);
  137.  
  138.     int pid,reason;
  139.  
  140.     chronos_log("HELLO\n");
  141.     while (continuer){
  142.         alarm(tbl->jobs->delay);
  143.         /* Attente d'un signal, ou plusieurs */
  144.         if( sigprocmask(SIG_BLOCK,&masque, NULL) == -1)
  145.             raler("masquage");
  146.  
  147.        //chronos_log("J'attends un signal\n");
  148.         sigsuspend(&vide);
  149.         /* Traitement des signaux reçus */
  150.         if( (recu_usr2 == 1) && (afficher == 1)){
  151.             table_print(tbl,1);
  152.             recu_usr2=0;
  153.         }
  154.         if(recu_usr1 == 1){
  155.  
  156.             if(afficher==0)
  157.                 afficher=1;
  158.             else
  159.                 afficher=0;
  160.  
  161.             recu_usr1=0;
  162.         }
  163.  
  164.         if(recu_term == 1){
  165.             continuer=0;
  166.             recu_term=0;
  167.         }
  168.         if(recu_alarm == 1){
  169.             switch (pid=fork()){
  170.             case -1:
  171.                 raler("fork");
  172.                 break;
  173.            
  174.             case 0:
  175.                 tbl->jobs->pid=getpid();
  176.                 chronos_log("INIT %s %d\n",tbl->jobs->id,tbl->jobs->pid);
  177.                 execvp(tbl->jobs->cmd[0],tbl->jobs->cmd);
  178.                 break;
  179.  
  180.             default:
  181.                 chronos_log("Je suis ton père\n");
  182.  
  183.                 if((pid=waitpid(tbl->jobs->pid,&reason,WNOHANG)) == -1)
  184.                     raler("waitpid");
  185.                 chronos_log("%d s'est arrêté\n",pid);
  186.                 if(pid == tbl->jobs->pid){
  187.                     if(reason == 0){
  188.                         chronos_log("FINI %s %d ok\n",tbl->jobs->id,tbl->jobs->pid);
  189.                     } else {
  190.                         chronos_log("FINI %s %d ko\n",tbl->jobs->id,tbl->jobs->pid);
  191.                     }
  192.                 } else{
  193.                     continue;
  194.                 }
  195.                 break;
  196.             }
  197.             recu_alarm=0;
  198.         }
  199.     }
  200.     chronos_log("BYE\n");
  201.     table_free (tbl);
  202. return;
  203. }
  204.  
  205. int main(int argc, char * argv [])
  206. {
  207.  
  208.     if(argc!=2)
  209.         raler("Usage : ./chronos <fichier.table>");
  210.    
  211.     chronos(argv[1]);
  212.  
  213.     return EXIT_SUCCESS;
  214. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top