Powrót na stronę UNIX

Czytelnicy i pisarze... z priorytetem!

Napisz dwa programy realizujące zagadnienie czytelników i pisarzy z priorytetem dla pisarzy przy użyciu semaforów i mechanizmów pamięci dzielonej. Zadaniem pisarzy jest cykliczne umieszczanie fragmentów o wielkości MEM_SIZE pliku tekstowego workfile w segmencie pamięci dzielonej. Zadaniem czytelników jest cykliczny odczyt zapisanego tam tekstu i wypisywanie go na ekran.

Główna część programu pisarza działa zgodnie z poniższym opisem:

  1. wczytanie kolejnego fragmentu pliku
  2. wejście do sekcji krytycznej pisarza zgodnie z algorytmem
  3. umieszczenie w pamięci dzielonej zczytanego tekstu
  4. odczekanie losowej ilości milisekund z przedziału <100, 500>
  5. opuszczenie sekcji krytycznej pisarza
  6. odczekanie losowej ilości milisekund z przedziału <1000, 2000>
  7. go to 1
Główna część programu czytelnika działa zgodnie z poniższym opisem:
  1. wejście do sekcji krytycznej czytelnika zgodnie z algorytmem
  2. odczytanie z pamięci dzielonej tekstu
  3. odczekanie 150 ms
  4. opuszczenie sekcji krytycznej czytelnika
  5. wyświetlenie tekstu na ekran
  6. odczekanie 150 ms
  7. go to 1
Można założyć, że wszystkich czytelników jest nie więcej niż READERS_MAX. Pierwszy utworzony proces pisarza jest odpowiedzialny za stworzenie odpowiednich mechanizmów komunikacji. Programy czytelników i pisarzy reagują na sygnał SIGINT kończąc działanie. Ostatni proces pisarza przed zakończeniem działania usuwa przydzielone zasoby IPC systemu V. Wtedy też wszyscy czytelnicy kończą działanie (podpowiedź: errno == EIDRM lub EINVAL). Można bezpiecznie założyć, że podczas tworzenia semaforów przez pierwszego oraz kończenia pracy przez ostatniego pisarza żadnen nowy pisarz nie zostanie uruchomiony. Po zczytaniu ostatniego fragmentu pliku pisarz zaczyna przetwarzać plik od początku a jeżeli fragment ten jest krótszy od MEM_SIZE, resztę bufora należy wypełnić znakami '\0'. workfile jest nazwą pliku tesktowego i podawany jest jako parametr wywołania programu pisarza. Liczby MEM_SIZE i READERS_MAX należy zadeklarować przy użyciu dyrektywy #define.

Cenne (jak zwykle) źródło informacji: http://www.mini.pw.edu.pl/~lucjan/UNIX/wyklad4.pdf   strona nr 14 (opis: strona nr 4 z uwzględnieniem warunków ze strony nr 6)



Szczególną uwagę zwracamy na:
Powrót na stronę UNIX