Istvan

oprendszerek 2. beadandó

Dec 6th, 2012
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.51 KB | None | 0 0
  1. /*
  2. Utasszámlálást végzünk a 4-6 villamos vonalon. A számlálás eredménye a diszpécserközpontban 5 másodpercenként (setitimer, rand) frissül. A diszpécser(szülő) beírja ezt az aktuális utasszámot egy osztott memóriába, majd küld egy jelzést a remiznek (gyerek), hogy ellenőrizze, elég villamos van-e vezényelve az utasok szállítására. Ha a remiz úgy látja, hogy kevés vagy sok a munkában lévő villamosok száma (a remiz ismeri a villamos kapacitását), akkor növeli vagy csökkenti azok számát, az aktuális igényeknek megfelelően! A vezényelt villamos számot beírja a remiz egy osztott memóriába, majd erről egy jelzést küld a diszpécsernek! A diszpécser jelezze ki az aktuális utas és villamos számot is! Készítse el a diszpécser (szülő) és remiz (gyerek) programját!
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <sys/time.h>
  9. #include <sys/ipc.h>
  10. #include <sys/shm.h>
  11. #include <fcntl.h>  
  12. #include <signal.h>
  13. #include <unistd.h>
  14.  
  15.  
  16. void timer_handler(int);
  17. void check_tram_space();
  18. int get_random(int, int);
  19. void print_no_of_tram_and_pass();
  20. int count_needed_trams();
  21. int positive_round(float);
  22. int negative_round(float);
  23. char* tram_sh_mem;
  24. char* pass_sh_mem;
  25.  
  26. int tram_capacity = 100;
  27. int id_pass, id_tram;
  28. pid_t remiz;
  29.  
  30. int main (int argc, char** argv)
  31. {
  32.   struct sigaction sa;
  33.   struct itimerval timer;
  34.  
  35.   key_t key_pass = ftok(argv[0], 1);
  36.   id_pass = shmget(key_pass, 80, IPC_CREAT|0600);
  37.   pass_sh_mem = shmat(id_pass, NULL, 0);
  38.  
  39.   key_t key_tram = ftok("fassaai", 1);
  40.   id_tram = shmget(key_tram, 80, IPC_CREAT|0600);
  41.   tram_sh_mem = shmat(id_tram, NULL, 0);
  42.  
  43.   // eloszor 0 villamos van
  44.   sprintf(tram_sh_mem, "%i", 0);
  45.  
  46.   memset(&sa, 0, sizeof(sa));
  47.   sa.sa_handler = &timer_handler;
  48.   sigaction(SIGVTALRM, &sa, NULL);
  49.   timer.it_value.tv_sec = 0;
  50.   timer.it_value.tv_usec = 1;  
  51.   timer.it_interval.tv_sec = 5;  
  52.   timer.it_interval.tv_usec = 1;  
  53.    
  54.   remiz = fork();
  55.  
  56.   if(remiz > 0){
  57.     setitimer(ITIMER_VIRTUAL, &timer, NULL);
  58.     signal(SIGUSR2, print_no_of_tram_and_pass);
  59.     while(1);
  60.   } else {
  61.     signal(SIGUSR1, check_tram_space);
  62.     while(1);
  63.   }
  64. }
  65.  
  66. void check_tram_space(){
  67.   //novelem vagy csökkentem a villamosok számát és meomóriába írom
  68.   int akt_trams = count_needed_trams();
  69.   sprintf(tram_sh_mem, "%i", akt_trams);
  70.  
  71.   // szolok a  diszplecsernek hogy kiirhatja az eredmenyt
  72.   kill(getppid(), SIGUSR2);
  73. }
  74.  
  75.  
  76. void timer_handler(int signum)
  77. {
  78.   // random jonnek az utasok ezt beirjuk egy memoriaba
  79.   int pass = get_random(4000,5000);
  80.   sprintf(pass_sh_mem, "%i", pass);
  81.  
  82.   // szol a remiznek aki a gyerek hogy szamoja ki a vilammosokat
  83.   kill(remiz, SIGUSR1);
  84. }
  85.  
  86. int count_needed_trams(){
  87.   int new_tram_no = 0;
  88.   int tram_no = atoi(tram_sh_mem);
  89.   int pass_no = atoi(pass_sh_mem);
  90.  
  91.   // hány tram kell
  92.   float needed_tram_no = pass_no/tram_capacity;
  93.  
  94.   if(0.0 < needed_tram_no){  
  95.     new_tram_no = positive_round(needed_tram_no + 1);
  96.   } else {                      
  97.     new_tram_no = negative_round(needed_tram_no - 1);
  98.   }
  99.  
  100.   return new_tram_no;
  101. }
  102.  
  103. int get_random(int min, int max){
  104.   srand(time(NULL));
  105.   int r_num = (rand()%(max-min)) + min;
  106.   return r_num;
  107. }
  108.  
  109. void print_no_of_tram_and_pass(){
  110.   printf("Villamosok szama: %s, utasok szama: %s \n", tram_sh_mem, pass_sh_mem);
  111. }
  112.  
  113. int positive_round(float my_float){
  114.   return (int)(my_float + 0.5);
  115. }
  116.  
  117. int negative_round(float my_float){
  118.   return (int)(my_float - 0.5);
  119. }
Advertisement
Add Comment
Please, Sign In to add comment