Zadanie 3 (lacza nienazwane) ---------------------------- Nalezy napisac program w C, ktory czyta ze standardowego wejscia zestaw danych, w ktorym w kazdym wierszu sa cztery liczby naturalne plus opcjonalne polecenie. Zadaniem programu jest utworzyc pewna liczbe procesow, ktore beda polaczone laczami nienazwanymi zgodnie z opisem i beda wykonywaly podane polecenie (poleceniem jest nazwa programu wraz z ewentualnymi argumentami). Wiersz postaci (M, m, N, n, polecenie) z pliku wejsciowego mowi, ze proces M ma byc polaczony z procesem N, przy czym deskryptor do pisania w procesie M odpowiadajacy polaczeniu ma numer m, a deskryptor do czytania w procesie N odpowiadajacy temu polaczeniu ma numer n. Dodatkowo, jesli podane jest pole ``polecenie'', to proces M ma wykonywac program podany w tym poleceniu. Jesli pola ``polecenie'' nie ma, to ma byc wykonywany program domyslny opisany dalej. Uwagi ----- Numery programow sluza wylacznie do ich identyfikacji i nie maja nic wspolnego z pidami procesow. Dany deskryptor danego procesu moze byc koncem wielu polaczen; jednak musi byc albo zawsze deskryptorem do czytania, albo zawsze deskryptorem do pisania. Polecenia maja byc wywolywane tak, aby wszystkie nie wymienione w pliku wejsciowym deskryptory byly zamkniete. Podanie w zestawie wejsciowym roznych polecen dla tego samego procesu jest bledem. Jesli proces nie ma zadnego podanego polecenia, to wykonuje program domyslny. Program domyslny probuje czytac ze wszystkich swoich deskryptorow otwartych do czytania i pisac przeczytane w ten sposob dane na przemian do wszystkich swoich deskryptorow otwartych do pisania. Program musi dzialac sprawiedliwie, tzn. jesli jakis deskryptor do czytania jest gotowy, to dane z niego zostana kiedys przeczytane, a jesli jakis deskryptor do pisania jest gotowy i jest odpowiednio duzo danych przeczytanych, to czesc tych danych zostanie zapisana na ten deskryptor. Program domyslny konczy sie, gdy stwierdzi koniec pliku na swoich deskryptorach otwartych do czytania. Liczba procesow jest rowna maksimum z najwiekszej liczby N i najwiekszej liczby M. Przyklady --------- Wejscie: 1 2 1 3 prog 1 2 2 3 prog 3 0 2 3 3 0 4 0 powoduje powstanie procesow 1, 2, 3 i 4, przy czym proces 1 wykonuje program "pro", a procesy 2, 3 i 4 program domyslny. Procesy sa polaczone laczem, przy czym pisanie na deskryptor 2 w procesie 1 i deskryptor 0 w procesie 3 powoduje pisanie do lacza, a czytanie z deskryptora 3 w procesie 1, deskryptora 3 w procesie 2 i deskryptora 0 w procesie 4 powoduje czytanie z tego samego lacza. Zauwaz, ze jesli z danym deskryptorem zwiazano wiele "polaczen", to wszystkie te polaczenia musza "przechodzic" przez to samo lacze. W powyzszym przykladzie wystepuje tylko jedno lacze! Lacze 1,2->1,3 musi byc tym samym laczem co 1,2->2,3, poniewaz maja ten sam deskryptor "wchodzacy". Lacze 1,2->1,3 musi byc tym samym laczem co 3,0->2,3, poniewaz maja ten sam deskryptor "wychodzacy". Z kolei Lacze 3,0->4,0 musi byc tym samym laczem co 3,0->2,3, poniewaz maja ten sam deskryptor "wchodzacy". Wobec przechodniosci relacji rownosci wszystkie te "polaczenia" musza stanowic jedno lacze. Wejscie: 1 1 2 0 2 1 3 0 3 1 4 0 powoduje powstanie linii procesow 1, 2, 3 i 4 polaczonych standardowo -- standardowe wyjscie poprzedniego do standardowego wejscia nastepnego.