compteur4mn.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. fflush(fp);
  34. fclose(fp);
  35. }
  36. break;
  37. case SIGUSR1:
  38. // code normalement exécuté si on reçoit SIGUSR2 (OAR?) ou SIGUSR1 (dmtcp);
  39. // NE FONCTIONNE PAS ( c'est donc le SIGINT 2 ci- dessus qui est utlisé dans
  40. // checkpoint-user1.oar
  41. printf("signal checkpoint SIGUSR1 recu \n");
  42. printf("valeur du compteur: %d\n", compteur);
  43. fp = fopen("context_compteur.txt", "wb");
  44. if(fp == NULL) {
  45. printf("error creating file");
  46. }
  47. else {
  48. fwrite( &compteur , sizeof(int) , 1 , fp);
  49. fclose(fp);
  50. }
  51. break;
  52. default :
  53. // sortie
  54. exit(0);
  55. }
  56. }
  57. //int main( int argc, char *argv[] )
  58. int main(void)
  59. {
  60. if (signal(SIGINT, sig_handler) == SIG_ERR)
  61. printf("\n ne peut pas recevoir SIGINT\n");
  62. // ----- test si un checkpoint existe ----
  63. // si oui, lecture de la valeur dans le fichier
  64. int i ;
  65. fp = fopen("context_compteur.txt", "rb");
  66. if (fp){
  67. fread( &i , sizeof(int) , 1 , fp);
  68. printf("valeur compteur au precedent checkpoint = %d\n", i);
  69. fclose(fp);
  70. }else{
  71. i=0;
  72. }
  73. // ---- le Compteur propremen dit ---------
  74. // 10 mn(environ: ce n'est pas un chrono!)
  75. for (compteur=i; compteur <=240; compteur++)
  76. {
  77. printf("compteur = %d\n", compteur);
  78. // force l'écriture sur la sortie
  79. fflush(stdout);
  80. sleep(1);
  81. }
  82. return 0;
  83. }