Komunikacja miedzy procesami w OS 9 mechanizm przekazywanie dost ep dost ep w komunikacji danych publiczny przerwaniu Czekanie na potomka Status wyjścia Wait for child Exit status Sygnał Numer sygnału Signal Signal code + Zdarzenie Wartość Event Event value + + Moduł danych Data module + + + Wspólna pami eć Shared memory + + + Ł acze bez nazwy Unnamed pipe + Ł acze z nazw a Named pipe + + Plik dyskowy Disk file + + MW-ZPCiR-ICT-PWr 1
Kody sygnałów w OS 9 0 - S$Kill - bezwzgl edne zakończenie procesu; 1 - S$Wake - wznowienie procesu bed acego w stanie sleep; 2 - S$Abort - przerwanie procesu ostatnio korzystaj acego z we/wy na terminal (Ctrl-E) - najcz esciej exit(2); 3 - S$Intrpt - (Ctrl-C) - najcz eściej exit(3); 4 - S$HangUp - wysyłany przez SCF przy utracie ł aczności modemowej (brak DCD); 5-255 - zarezerwowane dla dalszych zastosowań systemowych; 256-65535 - dla użytkowników. MW-ZPCiR-ICT-PWr 2
w deskryptorze procesu adr. C asm znaczenie 26 signal P$Signal Kod ostatniego sygnału czekaj acego 28 sigvec P$SigVec Adres procedury obsługi sygnałów (signal handler) 2C sigdat P$SigDat Adres obszaru danych dla handlera... 370 siglvl P$SigLvl maska zagł ebienia obsługi sygnałów 371 sigflg P$SigFlg bit 7 - flaga otrzymania sygnału w trakcie pracy 372 sigxs P$Sigxs ilość wolnych miejsc w kolejce sygnałów 374 sigmask P$SigMask maska bitowa sygnałów 2 32 378 sigcnt P$SigCnt ilość sygnałów czekaj acych 37C sigque P$SigQue Adres najstarszego sygnału czekaj acego 380 defsig P$DefSig Pocz atkowa struktura kolejki sygnałów MW-ZPCiR-ICT-PWr 3
Funkcje systemowe OS 9 zwi azane z obsług a sygnałów Nazwa funkcja w C Opis F$Send kill (int id, short code) wysłanie sygnału code do procesu id F$Icpt intercept (int (*shand)()) zainstalowanie procedury obsługi sygnałów shand F$SigMask sigmask (int level) ustawianie maski sygnałów dla procesu: 0, ++, F$Sleep sleep (unsigned time) zawieszenie procesu na time sekund lub do otrzymania sygnału pause() zawieszenie procesu do otrzymania sygnału MW-ZPCiR-ICT-PWr 4
OS-9 Skutki wysłania sygnału do procesu uaktywnienie procesu adresata (o ile nie jest bież acy lub aktywny - F$AProc) - maskowanie sygnałów nie ma wpływu na t e czynność; przy przejściu procesu adresata do trybu USER uruchomienie procedury obsługi sygnałów (P$SigVec) jako podprogramu: utworzenie ramki powrotu na stosie (R$pc, R$sr) zmiana R$pc na P$SigVec, ustawienie kodu sygnału z P$SigQue w R$d1; UWAGI: 1. W przypadku braku handlera (P$SigVec 0) proces adresat jest kończony przy probie przejścia do trybu USER, a status wyjścia jest ustawiany na numer sygnału. 2. zamaskowane indywidualnie przez P$SigMask nie uruchamiaj a handlera i nie s a kolejkowane. 3. Ustawiona maska (P$SigLvl 0) powoduje kolejkowanie sygnału bez uruchamiania handlera. MW-ZPCiR-ICT-PWr 5
OS-9 specjalne: S$Kill i S$Wake S$Kill (kod = 0): nie jest kolejkowany, ustawia E$PrcAbt (228) w P$Signal, ustawia flag e Condemn w P$State (przy próbie uruchomienia w trybie USER proces jest kończony). S$Wake (kod = 1): nie jest kolejkowany, nie zmienia P$Signal, służy wył acznie do aktywizacji procesów. MW-ZPCiR-ICT-PWr 6
Przykład wysyłania sygnałów w C #include <stdio.h> main(argc, argv) int argc; char *argv[]; { int pid, code; switch(argc){ default: fprintf(stderr,"usage: sendsig pid code\n"); exit(0); case 3: pid = atoi(argv[1]); code = atoi(argv[2]); break; } } kill(pid, code); exit(0); MW-ZPCiR-ICT-PWr 7
Przykład obsługi sygnałów w C (1/2) #include <stdio.h> FILE *log; /* sighand - procedura obslugi sygnalow */ sighand (signal) register int signal; { switch (signal){ case 2: _errmsg(0," terminated by signal # 2\n"); exit(0); case 3: _errmsg(0," terminated by signal # 3\n"); exit(0); default: fprintf(log," Signal # %d\n",signal); return(0); } } MW-ZPCiR-ICT-PWr 8
Przykład obsługi sygnałów w C (2/2) /* program glowny " showsig " */ main(argc, argv) int argc; char *argv[]; { if(argc!=2){ fprintf(stderr," Usage: showsig [logfile]\n"); exit(0); } if(!(log=fopen(argv[1]," a+ "))){ fprintf (stderr," Can t open: %s \n",argv[1]); exit(0); } intercept(sighand); } while(1) sleep(0); MW-ZPCiR-ICT-PWr 9
OS-9 Zdarzenia Zdarzenia (events): liczniki obsługiwane przez j adro systemu, publicznie dost epne przez nazw e, pozwalaj ace synchronizować procesy. Tworzenie zdarzenia wymaga podania nazwy i pocz atkowych parametrów dla funkcji F$Event(Ev$Creat) (wartość, przyrost automatyczny i przyrost przy budzeniu). Wykorzystanie zdarzenia wymaga doł aczenia si e funkcj a F$Event(Ev$Link), która na podstawie podanej nazwy zwraca numer zdarzenia (ID). Proces znaja cy ID zdarzenia może: odczytać jego wartość zmienić tȩ wartość czekać na wpadni ecie wartości do zadanego przedziału Wartość zdarzenia może zostać zmieniona przez: ustawienie bezwzgl ednej wartości (set absolute) dodanie (ze znakiem) wartości (set relative) dodanie przyrostu automatycznego (signal increment) chwilowe ustawienie bezwzgl ednej wartości (pulse event) MW-ZPCiR-ICT-PWr 10
Zdarzenia Element tablicy zdarzeń: adr. nazwa znaczenie 00 ev eid numer zdarzenia w systemie 02 ev name nazwa zdarzenia (max. 11-znaków) 0e ev value 4-bajtowa wartość zdarzenia 12 ev winc automatyczny przyrost wartości przy budzeniu 14 ev sinc sygnałowy przyrost wartości 16 ev link ilość użytkowników zdarzenia 18 ev quen wskaźnik do nast epnego zdarzenia 1C ev quep wskaźnik do poprzedniego zdarzenia typedef struct _evstr { unsigned short _ev_eid; /* event id number */ char _ev_name[12]; /* event name */ int _ev_value; /* current event value */ short _ev_winc; /* wait increment value */ short _ev_sinc; /* signal increment value */ unsigned short _ev_link; /* event use count */ struct _evstr *quen; /* next event in queue */ struct _evstr *quep; /* previous event in queue */ } event; MW-ZPCiR-ICT-PWr 11
Zdarzenia Funkcje obsługi zdarzeń w OS 9 Nazwa funkcja w C Opis Ev$Link ev link() użycie zdarzenia (w/g nazwy) Ev$UnLnk ev unlink() zwolnienie zdarzenia Ev$Creat ev create() utworzenie zdarzenia Ev$Delet ev delete() usuni ecie zdarzenia Ev$Wait ev wait() oczekiwanie na zdarzenie Ev$WaitR ev waitr() oczekiwanie na wzgl edn a wartość zdarzenia Ev$Read ev read() odczytanie wartości licznika bez oczekiwania Ev$Info ev info() odczytanie parametrów zdarzenia Ev$Pulse ev pulse() chwilowa symulacja wyst apienia zdarzenia Ev$Signl ev signal() sygnalizacja wyst apienia zdarzenia Ev$Set ev set() ustawienie licznika i sygnalizacja zdarzenia Ev$SetR ev setr() wzgl edne ustawienie licznika i sygnalizacja zdarzenia MW-ZPCiR-ICT-PWr 12
Zdarzenia Opis podstawowych funkcji ev creat( ev value, wait inc, signal inc, ev name ) tworzy zdarzenie o nazwie ev name, pocz atkowej wartości ev value, przyroście automatycznym wait inc i przyroście sygnałowym signal inc ; zwraca ev id. ev link( ev name ) zwraca ev id dla zdarzenia o nazwie ev name. ev set( ev id, ev value, allflag ) ustawia zdarzenie ev id na wartość ev value i budzi pierwszy (allflag == 0x0000) lub wszystkie (allflag == 0x8000) procesy oczekuj ace na nie. ev setr( ev id, ev value, allflag ) zmienia wartość zdarzenia ev id o ev value i budzi pierwszy lub wszystkie procesy oczekuj ace na to zdarzenie. ev wait(ev id, ev min, ev max ) czeka na pojawienie si e wartości zdarzenia ev id w przedziale ( ev min, ev max ), modyfikuje j a o przyrost automatyczny i zwraca jako wynik. ev signal( ev id, allflag ) modyfikuje wartość zdarzenia ev id o przyrost sygnałowy i budzi pierwszy lub wszystkie procesy oczekuj ace na to zdarzenie. MW-ZPCiR-ICT-PWr 13
Zdarzenia Przykład przydziału zasobów (N drukarek) Tworzymy zdarzenie o pocz atkowej wartości N (wszystkie drukarki dost epne). Wait inc ustalamy na -1 (zaj ecie drukarki), a signal inc na 1 (zwolnienie drukarki). event_id =_ev_creat(n,-1,1,"dr"); /* utworzenie zdarzenia */ Proces chc acy korzystać z drukarki musi czekać (Ev$Wait) na wartość zdarzenia w przedziale [1,N]. Dzi eki temu, póki s a jakieś wolne drukarki, procesy s a kontynuowane, a wartość zdarzenia odzwierciedla ilość wolnych drukarek. event_id = _ev_link("dr"); /* przylaczenie do zdarzenia */ _ev_wait(event_id,1,n); /* czekanie na wolna drukarke */ drukuj(); /* drukowanie */ Po zakończeniu drukowania proces zwalnia drukark e i sygnalizuje to (Ev$Signal). _ev_signal(event_id,0); /* zwolnienie drukarki */ Ilość wolnych drukarek (wartość zdarzenia) jest zwi ekszana. Jeśli jakiś proces był zatrzymany na Ev$Wait z powodu braku drukarek (wartość zdarzenia poza [1,N]), to po zwróceniu drukarki przez inny proces zostanie uaktywniony (zbudzony) i on z kolei b edzie mógł zaj ać drukark e. MW-ZPCiR-ICT-PWr 14
Zdarzenia Przykład synchronizacji: jeden pisze, wielu czyta Proces pisz acy: /***************************************************************/ event_id =_ev_creat(0,1,-1,"mw"); /* utworzenie zdarzenia: value = 0 wait_inc = 1 signal_inc = -1 name = "mw" */ new_data(); /* wpis danych */ _ev_set(event_id,m,ev_allprocs); /* budzenie proc. czytaj. */ _ev_setr(event_id,-1*m,0); _ev_wait(event_id,0,0); /* czekanie na zero */ /***************************************************************/ Procesy czytajace: /***************************************************************/ event_id = _ev_link("mw"); /* przylaczenie do zdarzenia */ _ev_wait(event_id,m,m+2000); /* czekanie na wartosc >=M */ takedata(); /* czytanie danych */ _ev_signal(event_id,0); /* zmniejszenie zdarzenia o 1 */ /***************************************************************/ MW-ZPCiR-ICT-PWr 15