compteur10mn.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h> //sleep
  6. /*
  7. - compteur sur 10 mn (affichage incrementations toutes les secondes)
  8. - capture de signaux ( pour test de checkpointing avec dmtcp /OAR Caclculco)
  9. - le compteur est sauvegardé dans un fichier sur capture de signal (SIGINT /2)
  10. -> à réutiliser pour reprise de travaux après checkpointing )
  11. */
  12. #define SIZE 1
  13. #define NUMELEM 5
  14. /*compteur variable globale ( main et signal ) */
  15. int compteur;
  16. //findice_ckpt
  17. FILE * fp;
  18. void sig_handler(int signal)
  19. {
  20. switch (signal)
  21. {
  22. case SIGINT:
  23. // code exécuté si on reçoit SIGINt (CTRL+C);
  24. printf("SIGINT recu (programme C)\n");
  25. printf("valeur du compteur enregistre: %d\n", compteur);
  26. // fichier de sauvegarde du "contexte" ( l'indice = nb de secondes!
  27. fp = fopen("context_compteur.txt", "wb");
  28. if(fp == NULL) {
  29. printf("error creating file");
  30. }
  31. else {
  32. fwrite( &compteur , sizeof(int) , 1 , fp);
  33. fclose(fp);
  34. }
  35. break;
  36. case SIGUSR2:
  37. // code normalement exécuté si on reçoit SIGUSR2 (OAR?) ou SIGUSR1 (dmtcp);
  38. // NE FONCTIONNE PAS ( c'est donc le SIGINT 2 ci- dessus qui est utlisé dans
  39. // checkpoint-user1.oar
  40. printf("signal checkpoint de dmtcp recu \n");
  41. printf("valeur du compteur: %d\n", compteur);
  42. fp = fopen("context_compteur.txt", "wb");
  43. if(fp == NULL) {
  44. printf("error creating file");
  45. }
  46. else {
  47. fwrite( &compteur , sizeof(int) , 1 , fp);
  48. fclose(fp);
  49. }
  50. break;
  51. default :
  52. // sortie
  53. exit(0);
  54. }
  55. }
  56. //int main( int argc, char *argv[] )
  57. int main(void)
  58. {
  59. if (signal(SIGINT, sig_handler) == SIG_ERR)
  60. printf("\n ne peut pas recevoir SIGINT\n");
  61. // ----- test si un checkpoint existe ----
  62. // si oui, lecture de la valeur dans le fichier
  63. int i ;
  64. fp = fopen("context_compteur.txt", "rb");
  65. if (fp){
  66. fread( &i , sizeof(int) , 1 , fp);
  67. printf("valeur compteur au precedent checkpoint = %d\n", i);
  68. fclose(fp);
  69. }else{
  70. i=0;
  71. }
  72. // ---- le Compteur propremen dit ---------
  73. // 10 mn(environ: ce n'est pas un chrono!)
  74. for (compteur=i; compteur <=600; compteur++)
  75. {
  76. printf("compteur = %d\n", compteur);
  77. // force l'écriture sur la sortie
  78. fflush(stdout);
  79. sleep(1);
  80. }
  81. return 0;
  82. }