Advertisement
Guest User

Untitled

a guest
Mar 26th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.88 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement