Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <time.h>
- #include <signal.h>
- #include <unistd.h>
- #include <array>
- using namespace std;
- // ovo je obicno polje, ali definirano preko std::array jer ima neke dodatne funkcije koje nas Lovrencic nije naucio (npr array.size())
- array<int,4> PRIORITET;
- array<int,3> sigs = {SIGINT,SIGQUIT,SIGTSTP}; // signali poredani po prioritetu, SIGINT najnizi, SIGTSTP najvisi
- int TEKUCI_PRIORITET;
- void obrada_prekida(int j)
- {
- cout << "Poceo obradu prekida " << j << endl;
- for (int i = 1; i < 6; i++) {
- cout << "Obrada prekida " << j << ": " << i << "/5" << endl;
- sleep(1);
- }
- cout << "Zavrsio obradu prekida " << j << endl;
- }
- void prekidna_rutina (int sig)
- {
- int i;
- time_t t;
- time(&t);
- cout << "Prekidna rutina pozvana u: " << ctime(&t) << endl;
- // u ovom switchu se odreduje koji je prioritet pozvanog prekida (i-prioritet)
- switch (sig) {
- case SIGINT:
- i = 1;
- break;
- case SIGQUIT:
- i = 2;
- break;
- case SIGTSTP:
- i = 3;
- break;
- default:
- return;
- }
- cout << "Razina prekida: " << i << endl;
- if(i > TEKUCI_PRIORITET) {
- PRIORITET[i] = TEKUCI_PRIORITET;
- TEKUCI_PRIORITET = i;
- // ignoriramo signale nizeg prioriteta
- for(size_t x=0;x<sigs.size();x++) {
- if(i > x) sigignore(sigs[x]);
- }
- obrada_prekida(i);
- // nakon obradenog prekida, pratimo signale manje od njega
- for(size_t x=0;x<sigs.size();x++) {
- if(i > x) sigset(sigs[x], prekidna_rutina);
- }
- TEKUCI_PRIORITET = PRIORITET[i];
- }
- }
- int main (void)
- {
- // cim pokrenemo program, cekamo signale
- for(size_t x=0;x<sigs.size();x++) {
- sigset(sigs[x], prekidna_rutina);
- }
- cout << "Poceo osnovni program " << endl;
- for (int i = 1; i < 31; i++)
- {
- cout << "Glavni program: " << i << "/30" << endl;
- sleep(1);
- }
- cout << "Zavrsio osnovni program" << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement