Advertisement
BagaevDanil

Untitled

Feb 12th, 2024
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.58 KB | None | 0 0
  1. /*
  2. * Выполнил: Багаев Даниил Алексеевич, 0374
  3. * Задание: (Т1) Приложение Linux: "Обеспечение таймаута"
  4. * Дата: 12-02-2024
  5. * Версия: 0.1
  6. *
  7. * Скрипт для компиляции и запуска:
  8. * gcc T1_Bagaev_0374.c && ./a.out
  9. * -----------------------------------------------------
  10. *
  11. * В программном коде было реализовано циклическая система управления, с периодом
  12. * time=3c. Она измеряет состояние объекта, выполняет действия по принятию
  13. * решения и формируют управляющие воздействия. Все эти действия реализуются
  14. * некоторой функцией doControl(). Функция doControl() вызывается родительском
  15. * процессе, а поимка сигнала реализована в дочернем процессе. Для «мягкого»
  16. * deadline взято время – 0.52 секунд (расчетное время работы функции
  17. * doControl() + 4%), а для «жесткого» deadline взято время – 1 секунда
  18. *
  19. */
  20.  
  21. #include <signal.h>
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <sys/time.h>
  25. #include <time.h>
  26. #include <unistd.h>
  27.  
  28. pid_t parent_pid, child_pid;
  29. const unsigned int work_time_control = 500 * 1000;
  30.  
  31. void doControl()
  32. {
  33. const int x = random() % 10;
  34. if (!x) {
  35. while (1) {}
  36. }
  37.  
  38. srandom(time(NULL));
  39. const long int dt = random() % 40000;
  40. const long int t = work_time_control + dt;
  41. printf("######## %ld \n", t);
  42. usleep(t);
  43. }
  44.  
  45. void deadlineHandler(int signum, siginfo_t *info, void *context)
  46. {
  47. printf("######### deadline exceeded #########\n");
  48. }
  49.  
  50. void alarmHandler()
  51. {
  52. printf("##### Restart required! #####\n");
  53. kill(child_pid, SIGUSR1);
  54. exit(EXIT_FAILURE);
  55. }
  56.  
  57. int main(int argc, char** argv)
  58. {
  59. signal(SIGALRM, alarmHandler);
  60.  
  61. const int deadline_signal = SIGRTMIN + 1;
  62. const unsigned int hard_dt = 1;
  63. const unsigned int soft_dt = work_time_control * 1.04;
  64. const unsigned frequency = 3 * 1000 * 1000;
  65.  
  66. struct timeval stop, start;
  67.  
  68. parent_pid = getpid();
  69. child_pid = fork();
  70.  
  71. while(1) {
  72. sigset_t set;
  73. sigemptyset(&set);
  74. sigaddset(&set, deadline_signal);
  75. sigprocmask(SIG_BLOCK, &set, NULL);
  76.  
  77. if (getpid() == parent_pid) {
  78. alarm(hard_dt);
  79.  
  80. gettimeofday(&start, NULL);
  81. doControl();
  82. gettimeofday(&stop, NULL);
  83.  
  84. long cDelta_us = (stop.tv_sec - start.tv_sec) * 1000000 + stop.tv_usec - start.tv_usec;
  85. if (cDelta_us > soft_dt) {
  86. siginfo_t info;
  87. info.si_value.sival_int = 100;
  88. sigqueue(child_pid, deadline_signal, info.si_value);
  89. }
  90.  
  91. alarm(0);
  92.  
  93. usleep(frequency - cDelta_us);
  94. } else {
  95. struct sigaction deadline_act;
  96. deadline_act.sa_sigaction = &deadlineHandler;
  97. deadline_act.sa_flags = SA_SIGINFO;
  98. deadline_act.sa_mask = set;
  99. sigaction(deadline_signal, &deadline_act, NULL);
  100. sigprocmask(SIG_UNBLOCK, &set, NULL);
  101. usleep(2900000);
  102. }
  103. }
  104.  
  105. return 0;
  106. }
  107.  
  108. /*
  109. *
  110. *
  111. * это мне повезло, он быстро закончился но бывает гораздо дольше
  112. ######## 896652
  113. ######### deadline exceeded #########
  114. ######## 875372
  115. ######### deadline exceeded #########
  116. ######## 504542
  117. ######## 665978
  118. ######### deadline exceeded #########
  119. ######## 1017797
  120. ##### Restart required! #####
  121. *
  122. *
  123. *
  124. */
  125.  
  126.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement