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: