Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 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!
- */
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/time.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <unistd.h>
- void timer_handler(int);
- void check_tram_space();
- int get_random(int, int);
- void print_no_of_tram_and_pass();
- int count_needed_trams();
- int positive_round(float);
- int negative_round(float);
- char* tram_sh_mem;
- char* pass_sh_mem;
- int tram_capacity = 100;
- int id_pass, id_tram;
- pid_t remiz;
- int main (int argc, char** argv)
- {
- struct sigaction sa;
- struct itimerval timer;
- key_t key_pass = ftok(argv[0], 1);
- id_pass = shmget(key_pass, 80, IPC_CREAT|0600);
- pass_sh_mem = shmat(id_pass, NULL, 0);
- key_t key_tram = ftok("fassaai", 1);
- id_tram = shmget(key_tram, 80, IPC_CREAT|0600);
- tram_sh_mem = shmat(id_tram, NULL, 0);
- // eloszor 0 villamos van
- sprintf(tram_sh_mem, "%i", 0);
- memset(&sa, 0, sizeof(sa));
- sa.sa_handler = &timer_handler;
- sigaction(SIGVTALRM, &sa, NULL);
- timer.it_value.tv_sec = 0;
- timer.it_value.tv_usec = 1;
- timer.it_interval.tv_sec = 5;
- timer.it_interval.tv_usec = 1;
- remiz = fork();
- if(remiz > 0){
- setitimer(ITIMER_VIRTUAL, &timer, NULL);
- signal(SIGUSR2, print_no_of_tram_and_pass);
- while(1);
- } else {
- signal(SIGUSR1, check_tram_space);
- while(1);
- }
- }
- void check_tram_space(){
- //novelem vagy csökkentem a villamosok számát és meomóriába írom
- int akt_trams = count_needed_trams();
- sprintf(tram_sh_mem, "%i", akt_trams);
- // szolok a diszplecsernek hogy kiirhatja az eredmenyt
- kill(getppid(), SIGUSR2);
- }
- void timer_handler(int signum)
- {
- // random jonnek az utasok ezt beirjuk egy memoriaba
- int pass = get_random(4000,5000);
- sprintf(pass_sh_mem, "%i", pass);
- // szol a remiznek aki a gyerek hogy szamoja ki a vilammosokat
- kill(remiz, SIGUSR1);
- }
- int count_needed_trams(){
- int new_tram_no = 0;
- int tram_no = atoi(tram_sh_mem);
- int pass_no = atoi(pass_sh_mem);
- // hány tram kell
- float needed_tram_no = pass_no/tram_capacity;
- if(0.0 < needed_tram_no){
- new_tram_no = positive_round(needed_tram_no + 1);
- } else {
- new_tram_no = negative_round(needed_tram_no - 1);
- }
- return new_tram_no;
- }
- int get_random(int min, int max){
- srand(time(NULL));
- int r_num = (rand()%(max-min)) + min;
- return r_num;
- }
- void print_no_of_tram_and_pass(){
- printf("Villamosok szama: %s, utasok szama: %s \n", tram_sh_mem, pass_sh_mem);
- }
- int positive_round(float my_float){
- return (int)(my_float + 0.5);
- }
- int negative_round(float my_float){
- return (int)(my_float - 0.5);
- }
Advertisement
Add Comment
Please, Sign In to add comment