elementary.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include <mpi.h>
  2. #include <stdio.h>
  3. #include <signal.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7. char buffer[100];
  8. void elapsedTimeToString(char *output, size_t size) {
  9. static clock_t start_time = 0;
  10. if (start_time == 0) {
  11. // Enregistrez le temps de démarrage lors de la première invocation
  12. start_time = clock();
  13. }
  14. // Calculez le temps écoulé depuis le démarrage du programme
  15. clock_t current_time = clock();
  16. double elapsed_time = ((double)(current_time - start_time)) / CLOCKS_PER_SEC;
  17. // Écrivez le temps écoulé dans la chaîne de texte
  18. snprintf(output, size, "Temps écoulé : %.2f secondes", elapsed_time);
  19. }
  20. int writeToFile(const char* text) {
  21. FILE *file;
  22. // Ouverture du fichier en mode écriture (efface le contenu existant)
  23. file = fopen("/tmp/output.txt", "a");
  24. // Vérifier si l'ouverture du fichier a réussi
  25. if (file == NULL) {
  26. perror("Erreur lors de l'ouverture du fichier");
  27. return 1;
  28. }
  29. // Écriture dans le fichier
  30. fprintf(file, "%s", text);
  31. // Fermeture du fichier
  32. fclose(file);
  33. printf("Données écrites dans le fichier avec succès.\n");
  34. return 0;
  35. }
  36. void handle_sigterm(int signum) {
  37. printf("Received SIGTERM (%d).\n", signum);
  38. snprintf(buffer,sizeof(buffer), "Received SIGTERM (%d).\n",signum);
  39. writeToFile(buffer);
  40. elapsedTimeToString(buffer, sizeof(buffer));
  41. writeToFile(buffer);
  42. // Ajoutez ici le code de nettoyage ou de gestion du signal SIGKILL
  43. // Exemple : Fermez les fichiers, libérez la mémoire, etc.
  44. // ...
  45. // Terminez proprement le programme
  46. exit(EXIT_SUCCESS);
  47. }
  48. void handle_sigint(int signum) {
  49. printf("Received SIGINT (%d).\n", signum);
  50. snprintf(buffer,sizeof(buffer), "Received SIGINT (%d).\n",signum);
  51. writeToFile(buffer);
  52. elapsedTimeToString(buffer, sizeof(buffer));
  53. writeToFile(buffer);
  54. exit(EXIT_SUCCESS);
  55. }
  56. int main() {
  57. // Installez le gestionnaire de signal pour SIGKILL
  58. elapsedTimeToString(buffer, sizeof(buffer));
  59. if (signal(SIGTERM, handle_sigterm) == SIG_ERR) {
  60. perror("Erreur lors de l'installation du gestionnaire de signal");
  61. return EXIT_FAILURE;
  62. }
  63. if (signal(SIGINT, handle_sigint) == SIG_ERR) {
  64. perror("Erreur lors de l'installation du gestionnaire de signal pour SIGINT");
  65. return EXIT_FAILURE;
  66. }
  67. MPI_Init(NULL, NULL);
  68. // Get the number of processes
  69. int world_size;
  70. MPI_Comm_size(MPI_COMM_WORLD, &world_size);
  71. // Get the rank of the process
  72. int world_rank;
  73. MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
  74. // Get the name of the processor
  75. char processor_name[MPI_MAX_PROCESSOR_NAME];
  76. int name_len;
  77. MPI_Get_processor_name(processor_name, &name_len);
  78. // Print off a hello world message
  79. printf("Hello world from processor %s, rank %d out of %d processors\n",
  80. processor_name, world_rank, world_size);
  81. printf("Le programme est en cours d'exécution. PID: %d\n", getpid());
  82. // Simulation d'une tâche en cours d'exécution
  83. while (1) {
  84. // Votre code ici...
  85. // Ajoutez une pause pour éviter une utilisation intensive du processeur
  86. sleep(1);
  87. }
  88. MPI_Finalize();
  89. return EXIT_SUCCESS;
  90. }