elementary.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #include <mpi.h>
  2. #include <signal.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <time.h>
  7. #include <unistd.h>
  8. #define CHECKPOINT_FILE "checkpoint_file.txt"
  9. char buffer[100];
  10. char buffertime[100];
  11. char checkpointfile[100] = CHECKPOINT_FILE;
  12. int step_x;
  13. int step_y;
  14. int world_rank;
  15. void elapsedTimeToString(char *output, size_t size) {
  16. static clock_t start_time = 0;
  17. if (start_time == 0) {
  18. // Enregistrez le temps de démarrage lors de la première invocation
  19. start_time = clock();
  20. }
  21. // Calculez le temps écoulé depuis le démarrage du programme
  22. clock_t current_time = clock();
  23. double elapsed_time = ((double)(current_time - start_time)) / CLOCKS_PER_SEC;
  24. // Écrivez le temps écoulé dans la chaîne de texte
  25. snprintf(output, size, "Temps écoulé : %.2f secondes", elapsed_time);
  26. }
  27. // Fonction pour sauvegarder l'état (checkpoint)
  28. void save_checkpoint(int x, int y) {
  29. FILE *fp = fopen(checkpointfile, "w");
  30. if (fp == NULL) {
  31. perror("Erreur à l'ouverture du fichier pour sauvegarder le checkpoint");
  32. exit(EXIT_FAILURE);
  33. }
  34. fprintf(fp, "%d %d", x, y);
  35. fclose(fp);
  36. printf("Checkpoint sauvegardé dans %s\n", checkpointfile);
  37. }
  38. // Fonction pour restaurer l'état à partir du checkpoint
  39. void restore_checkpoint(int *x, int *y) {
  40. FILE *fp = fopen(checkpointfile, "r");
  41. if (fp != NULL) {
  42. // perror("Erreur à l'ouverture du fichier pour restaurer le checkpoint");
  43. // exit(EXIT_FAILURE);
  44. if (fscanf(fp, "%d %d", x, y) != 2) {
  45. fprintf(stderr, "Erreur de lecture dans le fichier de checkpoint\n");
  46. exit(EXIT_FAILURE);
  47. }
  48. fclose(fp);
  49. printf("Checkpoint restauré : x = %d, y = %d\n", *x, *y);
  50. } else {
  51. printf("Pas de fichier checkpoint \n");
  52. }
  53. }
  54. int writeToFile(const char *text) {
  55. FILE *file;
  56. // Ouverture du fichier en mode écriture (efface le contenu existant)
  57. file = fopen("/tmp/output.txt", "a");
  58. // Vérifier si l'ouverture du fichier a réussi
  59. if (file == NULL) {
  60. perror("Erreur lors de l'ouverture du fichier");
  61. return EXIT_FAILURE;
  62. }
  63. // Écriture dans le fichier
  64. fprintf(file, "rank %i, %s\n", world_rank, text);
  65. // Fermeture du fichier
  66. fclose(file);
  67. printf("Données écrites dans le fichier avec succès.\n");
  68. return EXIT_SUCCESS;
  69. }
  70. void handle_sigterm(int signum) {
  71. printf("Received SIGTERM (%d).\n", signum);
  72. snprintf(buffer, sizeof(buffer), "Received SIGTERM (%d).\n", signum);
  73. writeToFile(buffer);
  74. elapsedTimeToString(buffertime, sizeof(buffertime));
  75. writeToFile(buffertime);
  76. // Ajoutez ici le code de nettoyage ou de gestion du signal SIGKILL
  77. // Exemple : Fermez les fichiers, libérez la mémoire, etc.
  78. // ...
  79. save_checkpoint(step_x, step_y);
  80. // Terminez proprement le programme
  81. exit(EXIT_SUCCESS);
  82. }
  83. int write_output_with_time(const char *prefix) {
  84. int error = EXIT_SUCCESS;
  85. printf("%s\n", prefix);
  86. snprintf(buffer, sizeof(buffer), "%s\n", prefix);
  87. error = writeToFile(buffer);
  88. if (error != EXIT_FAILURE) {
  89. elapsedTimeToString(buffertime, sizeof(buffertime));
  90. error = writeToFile(buffertime);
  91. }
  92. return error;
  93. }
  94. void handle_sigint(int signum) {
  95. char bufflocal[100];
  96. int error = EXIT_SUCCESS;
  97. snprintf(bufflocal, sizeof(bufflocal), "Received SIGINT (%d).\n", signum);
  98. error = write_output_with_time(bufflocal);
  99. exit(error);
  100. }
  101. int main(int argc, char **argv) {
  102. // Installez le gestionnaire de signal pour SIGKILL
  103. elapsedTimeToString(buffertime, sizeof(buffertime));
  104. if (signal(SIGTERM, handle_sigterm) == SIG_ERR) {
  105. perror("Erreur lors de l'installation du gestionnaire de signal");
  106. return EXIT_FAILURE;
  107. }
  108. if (signal(SIGINT, handle_sigint) == SIG_ERR) {
  109. perror(
  110. "Erreur lors de l'installation du gestionnaire de signal pour SIGINT");
  111. return EXIT_FAILURE;
  112. }
  113. MPI_Init(&argc, &argv);
  114. // Get the number of processes
  115. int world_size;
  116. MPI_Comm_size(MPI_COMM_WORLD, &world_size);
  117. // Get the rank of the process
  118. MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
  119. sprintf(checkpointfile, "%s.%i", checkpointfile, world_rank);
  120. // Get the name of the processor
  121. char processor_name[MPI_MAX_PROCESSOR_NAME];
  122. int name_len;
  123. MPI_Get_processor_name(processor_name, &name_len);
  124. step_x = 0;
  125. step_y = 0;
  126. restore_checkpoint(&step_x, &step_y);
  127. // Print off a hello world message
  128. printf("Hello world from processor %s, rank %d out of %d processors\n",
  129. processor_name, world_rank, world_size);
  130. printf("Le programme est en cours d'exécution. PID: %d\n", getpid());
  131. int counter = 0;
  132. // Simulation d'une tâche en cours d'exécution
  133. while (counter < 5) {
  134. // Votre code ici...
  135. step_x++;
  136. sleep(2);
  137. step_y++;
  138. // Ajoutez une pause pour éviter une utilisation intensive du processeur
  139. sleep(1);
  140. counter++;
  141. }
  142. MPI_Finalize();
  143. write_output_with_time("Réussite du traitement");
  144. return EXIT_SUCCESS;
  145. }