Guest User

Untitled

a guest
Jan 21st, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.28 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <signal.h>
  3.  
  4. #define N 6
  5.  
  6. int Oznaka_cekanja[N];
  7. int Prioritet[N];
  8. int Tekuci_prioritet;
  9.  
  10. int sig[]={SIGUSR1, SIGUSR2, SIGHUP, SIGCHLD, SIGINT};
  11.  
  12. void zabrani_prekidanje(){
  13. int i;
  14. for (i = 0; i < 5; i++)
  15. sighold(sig[i]);
  16. }
  17.  
  18. void dozvoli_prekidanje(){
  19. int i;
  20. for (i = 0; i < 5; i++)
  21. sigrelse(sig[i]);
  22. }
  23.  
  24. void obrada_prekida(int i){
  25. int k, j;
  26. for (j = 1; j < 6; j++){
  27. sleep(1);
  28. for (k = 0; k < i; k++)
  29. printf("- ");
  30. printf("%d", j);
  31. for (k = i; k < N; k++)
  32. printf("- ");
  33. printf("-\n");
  34. }
  35. }
  36.  
  37. void prekidna_rutina(int sig){
  38. int n = 1;
  39. int x, j;
  40. zabrani_prekidanje();
  41. switch(sig){
  42. case SIGUSR1:
  43. n = 1;
  44. printf("- X - - - -\n");
  45. break;
  46. case SIGUSR2:
  47. n = 2;
  48. printf("- - X - - -\n");
  49. break;
  50. case SIGHUP:
  51. n = 3;
  52. printf("- - - X - -\n");
  53. break;
  54. case SIGCHLD:
  55. n = 4;
  56. printf("- - - - X -\n");
  57. break;
  58. case SIGINT:
  59. n = 5;
  60. printf("- - - - - X\n");
  61. break;
  62. }
  63. Oznaka_cekanja[n] = 1;
  64.  
  65. do {
  66. x = 0;
  67. for (j = Tekuci_prioritet + 1; j < N; j++){
  68. if (Oznaka_cekanja[j] != 0)
  69. x = j;
  70. }
  71. if (x > 0){
  72. Oznaka_cekanja[x] = 0;
  73. Prioritet[x] = Tekuci_prioritet;
  74. Tekuci_prioritet = x;
  75. dozvoli_prekidanje();
  76. obrada_prekida(x);
  77. zabrani_prekidanje();
  78. Tekuci_prioritet = Prioritet[x];
  79. }
  80. } while (x > 0);
  81.  
  82. dozvoli_prekidanje();
  83. }
  84.  
  85. int main(){
  86. sigset(SIGUSR1, prekidna_rutina);
  87. sigset(SIGUSR2, prekidna_rutina);
  88. sigset(SIGHUP, prekidna_rutina);
  89. sigset(SIGCHLD, prekidna_rutina);
  90. sigset(SIGINT, prekidna_rutina);
  91.  
  92. int k;
  93. printf("Proces obrade prekida, PID = %d\n", getpid());
  94. for (k = 1; k < 10; k++){
  95. printf("%d - - - - -\n", k);
  96. sleep(1);
  97. }
  98. printf("Zavrso osnovni program\n");
  99. return 0;
  100. }
Add Comment
Please, Sign In to add comment