ZADANIE 1 ****************************** termin rozliczenia: na zajeciach 29/30 marca (zaleznie od terminu cwiczen) ****************************** Oczekiwane dzialanie programu mozna zaobserwowac na przykladzie programu demonstracyjnego: public/progwsp/zadania/zad1 Program uruchomiony w postaci zad1 generuje teksty kontrolne (wyjasniajace dzialanie). Zeby sie ich pozbyc nalezy go uruchomic poleceniem zad1 2>err (czyli przeadresowac stderr na plik err, zamiast err mozna uzyc dowolnej innej nazwy pliku, ew. /dev/null). Uwaga: takie przeadresowanie nie jest dostepne we wszystkich interpretatorach (a wiec nalezy wczesniej uruchomic sh, jesli uzywa sie innego interpretatora). ****************************** Tablica sortujaca: Grupa procesow przechowuje lacznie liczby naturalne, po jednej w kazdym procesie, od najmniejszej do najwiekszej. Pierwszy proces uruchamia sie z poziomu interpretatora przekazujac mu jako argument pierwsza liczbe. Proces zapamietuje te liczbe i czeka na wprowadzanie kolejnych liczb. Na kazda nastepna proces reaguje nastepujaco: -- gdy jest to liczba ujemna, to wypisuje komunikat o wprowadzeniu blednej liczby, liczbe ignoruje i czeka na nastepna, -- gdy liczba jest dodatnia, to porownuje ja ze "swoja" liczba, zostawia sobie mniejsza, a wieksza przekazuje procesowi na prawo. Jesli takiego procesu jeszcze nie ma to go tworzy (przekazujac mu jako argument wieksza liczbe), tworzy dwa lacza do komunikacji z sasiadem z prawej strony (do jednego bedzie tylko pisal, a z drugiego tylko czytal), po czym czeka na wprowadzenie z wejscia kolejnej liczby, -- gdy jest to liczba zero, to proces wypisuje na standardowe wyjscie swoja liczbe. Nastepnie probuje wypelnic "dziure" w tablicy pobierajac liczbe od sasiada po prawej. Jesli sasiada nie ma (proces sam jest skrajnym prawym), to konczy dzialanie. Jesli sasiad jest, to wpisuje do swojego lacza wyjsciowego (ktory jest jego laczem wejsciowym) liczbe 0, oznaczajaca zadanie przekazania liczby. Nastepnie czyta te liczbe ze swojego lacza wejsciowego (ktory jest laczem wyjsciowym sasiada). Gdy stwierdzi, ze sasiad oddal ostatnia liczbe (a wiec zakonczyl dzialanie), to zamyka oba lacza sluzace im do komunikacji. Uwagi: 1. Prosze zauwazyc, ze kazdy proces w tym zbiorze dziala dokladnie tak samo, a wiec nowo utworzony potomek bedzie wykonywal ten sam kod co proces macierzysty. 2. Kazdy proces korzysta z 5 deskryptorow: standardowego wejscia (z ktorego czyta liczby od sasiada po lewej), standardowego wyjscia (dokad wysyla liczby sasiadowi po lewej), standardowego pliku diagnostycznego (na ktory pisze komunikaty o bledach i komunikaty kontrolne), lacza, do ktorego przekazuje liczby sasiadowi po prawej i lacza, z ktorego pobiera liczby od sasiada po prawej. 3. Nalezy pamietac o: -- obsludze bledow wszystkich wywolan funkcji systemowych i bibliotecznych, -- zamykaniu nieuzywanych deskryptorow plikow, -- sprawdzaniu istnienia argumentow wejsciowych, -- eleganckim formatowaniu i komentowaniu kodu, -- rzetelnym przetestowaniu programu PRZED oddaniem do zaliczenia. Powodzenia, Janina Mincer (3.02.1995)