Problem proizvođača i potrošača

Zadatak

Ostvariti komunikaciju između procesa proizvođača i potrošača korištenjem međuspremnika ograničene duljine. Na osnovu broja parametara komandne linije, početni proces stvara odgovarajući broj procesa proizvođača te jednog potrošača. Svaki proizvođač preuzima jedan niz znakova zadan iz komandne linije i šalje preko međuspremnika znak po znak potrošaču (prema primjeru pokretanja programa pri dnu stranice). Potrošač prima znak po znak te kad je primio sve znakove (uključujući i znakove za kraj niza znakova '\0' koje su mu poslali proizvođači) ispisuje sve primljene znakove te završava s radom.

Prijedlog strukture rješenja

Podaci zajednički za proizvođače i potrošače (smjestiti ih u zajednički spremnik koji se mora posebno stvoriti):

Struktura procesa proizvođač:

proces proizvođač
   pročitaj niz znakova s tipkovnice u polje s[]
   i = 0
   čini
      čekaj_PRETINCI
      čekaj_PIŠI
      M[ULAZ] = s[i]
      ULAZ = (ULAZ+1) mod 5
      postavi_PIŠI
      postavi_PORUKE
      i = i+1
   do kraja niza
kraj.

Struktura procesa potrošač:

proces potrošač
   i = 0
   čini
      čekaj_PORUKE
      s[i] = M[IZLAZ]
      IZLAZ = (IZLAZ+1) mod 5
      postavi_PRETINCI
      i = i+1
   do kraja svih nizova
   ispiši niz znakova iz polja s[] na zaslon
kraj.

Napomene

Oznaku kraja niza također prenositi koristeći međuspremnik kako bi proces potrošač mogao znati kada nastupa kraj niza. Proces potrošač treba ispisati primljene znakove i završiti tek kada primi sve oznake kraja niza. "Usporite" rad procesa proizvođača jednim pozivom sleep(1) unutar petlje.

Primjer ispisa i pokretanja programa (zadana su dva niza: 12345678 i abcdef pa se stvaraju dva procesa proizvođača):

# ./a.out 12345678 abcdef
PROIZVOÐAČ1 -> 1
PROIZVOÐAČ2 -> a
POTROSAC <- 1
PROIZVOÐAČ1 -> 2
POTROSAC <- a
PROIZVOÐAČ2 -> b
POTROSAC <- 2
PROIZVOÐAČ1 -> 3
POTROSAC <- b
PROIZVOÐAČ2 -> c
POTROSAC <- 3
PRPROIZVOÐAČ1 1 -> 4
POTROSAC <- c
PROIZVOÐAČ1 -> 5
POTROSAC <- 4
PROIZVOÐAČ2 -> d
POTROSAC <- 5
PROIZVOÐAČ1 -> 6
POTROSAC <- d
PROIZVOÐAČ2 -> e
POTROSAC <- 6
PROIZVOÐAČ2 -> f
POTROSAC <- e
PROIZVOÐAČ1 -> 7
POTROSAC <- f
PROIZVOÐAČ2 -> 
POTROSAC <- 7
PROIZVOÐAČ1 -> 8
POTROSAC <- 
PROIZVOÐAČ1 -> 
POTROSAC <- 8
POTROSAC <- 
 
Primljeno je 1a2b3c45d6ef78
#