Powrót na stronę UNIX

Zadanie składa się z tylko jednego typu programów, które są zarazem serwerem jak i klientem. Pierwszy z uruchomionych procesów ma za zadanie wypisywać na stdout to co dostaje na stdin oraz utworzyć socket typu lokalnego (nazwa pliku socket'u to 1 parametr) na którym będzie przyjmował połączenia.

Kolejne procesy można wywoływać z drugim parametrem wskazującym socket serwera z którym mają się połączyć (parametr 2). Taki proces nie pobiera danych z wejścia, ale z socketu od serwera z którym jest połączony.

Zatem nasz program można uruchomić na 2 sposoby, z jednym parametrem jako serwer lub z dwoma jako jednoczesnie sewer i klient.

Serwer do którego socketu podłączone są inne procesy ma przesyłać dane przez te łącza zamiast wypisywać je na stdout. Można zatem połączyć kilka procesów poprzez socket w strukturę drzewa, w którym dane z korzenia są przesyłane do wszystkich liści. Dopiero liść drzewa drukuje dane na ekran.

Każdy z procesów można natychmiast wyłączyć Ctrl-C (ew. Ctrl-D patrz niżej). Jeśli zakończony zostanie w ten sposób proces który pełni rolę serwera, to te procesy, które korzystały z niego mają płynnie (bez utraty danych) przejść na odczyt z stdin. Jeśli wyłączany program był podłączony do odbioru danych od innego procesu (B), to proces B ma poprawnie zamknąć zerwane łącze i jeśli B nie ma więcej otwartych łączy ponownie zaczyna wypisywać na stdout.

Podanie Ctrl-D (podczas odczytu z stdin) do procesu kończy odczyt danych z klawiatury wypisuje lub wysyła ostatni pakiet danych i poprawnie zamyka program.

Dane przesyłane między procesami mają postać 20 znakowych tekstów poprzedzonych tekstem [PID] gdzie PID to pid procesu który pobrał dane z stdin. Można do komunikacji przez socket używać pakietów o ustalonym wymiarze.

Wszystkie programy mają być jedno-procesowe, należy użyć funkcji select, zakładamy, że każdy proces może przyjąć maksymalnie 5 połączeń naraz. 6 połączenie można ignorować aż zwolni się jedno z miejsc w tablicy deskryptorów.

UWAGI:

  1. Program wywołany bez parametrów wypisuje USAGE.
  2. Zadanie będzie sprawdzane przez Marcina Borkowskiego, należy je wgrać do katalogu /home2/samba/borkowskim/unix/ .


Szczególna uwagę zwracamy na:
Powrót na stronę UNIX