Programowanie współbieżne
II rok informatyki studia dzienne, studia II-giego stopnia
rok akademicki 2006/2007 semestr zimowy
zadanie z sygnałów (poziom shell'a):
1.1). Otworzyć dwie konsole (np. 2x okienka terminala), zalogować się.
1.2). Na jednej konsoli uruchomić skompilowany
program w C (proszę sobie go napisać:
program oczekuje, aż użytkownik wpisze
wielkość
liczbową, po czym w programie jest
polecenie delay() trwające tyle, ile wynosiła
wpisana wielkość - proszę sprawdzić jednostki!
sekundy? milisekundy? Macie to wiedzieć!
Ewentualnie zamiast delay() może być pętla
wypisująca ileśtamdziesiąt razy dowolny
komunikat na ekranie, chodzi o to, by
proces działał odpowiednio długo)
1.3). Program sobie działa na jednej konsoli, a
na drugiej wywołujecie Państwo komendę shell'a, która pokazuje stan
wszystkich
procesów użytkownika (obojętnie, na jakiej
konsoli uruchomionych!) Jaka to komenda? Sposób wywołania to jedna z odpowiedzi
na to zadanie.
1.4). Proszę następnie za pomocą innej komendy ubić Wasz proces. Jaką komendą?
1.5). Proszę sprawdzić, jak komenda ubijająca procesy działa z różnymi opcjami
(zwykłe uruchomienie oraz z opcją -9)
zadanie z sygnałów (poziom programowania):
2.1). Program z I-szej części zadań uruchomić
na 1-ej konsoli, proces ma długo działać i gdzieś wyświetlić swój identyfikator
(numer PID), na drugiej uruchomić proces,
który ubije proces uruchomiony na pierwszej konsoli (programowo!)
2.2). Program z powyższego zadania zmodyfikować
tak, by przechwycił sygnał CTRL+C, czyli by
działał dalej.
Po przechwyceniu
CTRL+Z normalnie kończy pracę.
Zadanie 2.2 można zrealizować za pomocą:
a) funkcji signal()
Podpowiedź:
void
obsuga_sygnalu()
{
...
// tu wpisujecie to, co Wasz program na zrobić zamiast zakończenia (wypisać
komunikat? fraszkę jakąś?)
...
}
void main ()
{
...
signal (nazwa_sygnału, obsuga_sygnalu() );
...
}
b) funkcji sigaction()
i funkcji z nią powiązanych
Przypominam, że tym sposobem można "podmienić" obsługę
sygnału niejako "na chwilę".
Przykład: Państwa program przechwytuje pierwsze wywołanie
przerwania odpowiadającego danemu sygnałowi
i robi coś, co mu kazaliście (komunikat etc), ale drugie
wywołanie sygnału już jest obsługiwane normalnie.
Dla osób, które zrealizują zadanie 2.2 zgodnie z punktem b), czyli w wykorzystaniem sigaction() tak, jak w opisie (czyli: pierwsze wywołanie sygnału ignorujemy i wypisuje proces komunikat "ha, ha, mnie nie ubijesz za pierwszym razem!", ale proces może zostać ubity za drugim razem (bo przywracamy domyślną obsługę sygnału) - otrzymuje dodatkowe 0.7 oceny!
(czyli możliwe jest otrzymanie 5.7 punktów za tę listę zadań!)
Literatura do zadań została podana na zajęciach, przypominam: