Advertisement
Guest User

Untitled

a guest
Mar 19th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.07 KB | None | 0 0
  1. /**
  2. * SO, 2016
  3. * Lab #4
  4. *
  5. * Task #6, lin
  6. *
  7. * Timers usage
  8. */
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #include <assert.h>
  13. #include <time.h>
  14.  
  15. #include <signal.h>
  16. #include <sys/time.h>
  17.  
  18. #include "utils.h"
  19.  
  20. #define TIMEOUT 2
  21.  
  22.  
  23. /*
  24. * SIGALRM handler - called when the timer expires
  25. */
  26. static void timer_handler(int signo)
  27. {
  28. time_t curr_time;
  29.  
  30. /* TODO - print time */
  31. curr_time = time(NULL);
  32. printf("time is: %s\n", ctime(&curr_time));
  33. }
  34.  
  35. /*
  36. * set signal handlers
  37. */
  38. static void set_signals(void)
  39. {
  40. struct sigaction sa;
  41. int rc;
  42.  
  43. memset(&sa, 0, sizeof(sa));
  44.  
  45. /* TODO - set handler for SIGALRM */
  46.  
  47. sa.sa_handler = timer_handler;
  48. rc = sigaction(SIGALRM, &sa, NULL);
  49. DIE(rc < 0, "Error");
  50. }
  51.  
  52. /*
  53. * configure timer to generate SIGALRM when fired
  54. * the timer expires at every TIMEOUT seconds
  55. */
  56. static void set_timer(void)
  57. {
  58. timer_t timerid;
  59. struct sigevent sev;
  60. struct itimerspec its;
  61. int rc;
  62.  
  63. /* TODO - Create the timer */
  64. sev.sigev_notify = SIGEV_SIGNAL;
  65. sev.sigev_signo = SIGALRM; /* Timer expiration signal */
  66. sev.sigev_value.sival_ptr = &timerid;
  67. rc = timer_create(CLOCK_REALTIME, &sev, &timerid);
  68. DIE(rc < 0, "timer");
  69. /* TODO - Start the timer */
  70.  
  71. its.it_value.tv_sec = TIMEOUT; /* Initial expiration in secs*/
  72. its.it_value.tv_nsec = 0;/* Initial expiration in nsecs*/
  73. its.it_interval.tv_sec = its.it_value.tv_sec; /* Timer interval in secs */
  74. its.it_interval.tv_nsec = its.it_value.tv_nsec; /* Timer interval in nanosecs */
  75.  
  76. rc = timer_settime(timerid, 0, &its, NULL);
  77. DIE(rc < 0,"settime");
  78. }
  79.  
  80. /*
  81. * use sigsuspend for waiting signals
  82. */
  83. static void wait_for_signal(void)
  84. {
  85. sigset_t old_mask;
  86. int rc;
  87.  
  88. /* TODO - wait for signal using sigsuspend */
  89. rc = sigprocmask(SIG_SETMASK, NULL, &old_mask);
  90. DIE(rc == -1, "sigprocmask");
  91.  
  92. sigsuspend(&old_mask);
  93. }
  94.  
  95. int main(void)
  96. {
  97. set_signals(); /* configure handler for SIGALRM */
  98. set_timer(); /* create and start timer */
  99.  
  100. while (1)
  101. wait_for_signal();
  102.  
  103. return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement