Imam problem s jednim zadatkom iz predmeta operacijski sustavi. Radi se u C-u na UNIXU. Na ovom linku je zadatak http://www.zemris.fer.hr/predmeti/os/pripreme/vj4.html. Problem mi je to što imam rješenje koje prolazi kompajler, ali ne radi ono što bi trebao. Bio bi jako zahvalan ako bi netko mogao baciti pogled na kod i reći mi gdje je greška tj. da mi na bilo koji način kaže što dalje raditi, jer mi jako bitno da riješim ovaj zadatak.
Hvala svima unaprijed!
Kod:
#include <sys/sem.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
typedef int semaphore;
semaphore pisi,pun, prazan;
int Id; /* identifikacijski broj segmenta */
int SemSetVal(int SemId, int SemNum, int SemVal)
{ /* postavi vrijednost semafora SemNum na SemVal */
return semctl(SemId, SemNum, SETVAL, &SemVal);
}
struct zajednicki_{
int ULAZ;
int IZLAZ;
char M[5];
};
#define MS_VEL sizeof(struct zajednicki_)
struct zajednicki_ *medjuspremnik;
void proizvodjac(int n){
char niz[100];
int i,len;
semop(pisi,0,-1);
printf("Unesi znakove za proizvodjaca %d: ", n);
scanf("%s", niz);
semop(pisi,0,1);
len=strlen(niz)+1;
for(i = 0; i < len; i++) {
semop(pun,0,-1);
semop(pisi,0,-1);
medjuspremnik->M[medjuspremnik->ULAZ] = niz[i];
medjuspremnik->ULAZ = (medjuspremnik->ULAZ + 1) % 5;
printf("Proizvodjac Poslao %d: %c\n", n, niz[i]);
sleep(1);
semop(pisi,0,1);
semop(pun,0,1);
}
printf("Proizvodjac gotov \n");
}
void potrosac(){
char niz[100],znak;
int i=0, kraj=0;
for(; kraj < 2 && i < 100; ) {
semop(prazan,0,-1);
znak=medjuspremnik->M[medjuspremnik->IZLAZ];
medjuspremnik->IZLAZ = (medjuspremnik->IZLAZ + 1) % 5;
if (znak != '\0')
niz[i++] = znak;
else
kraj++;
printf("Potrosac Primio: %c\n", znak);
semop(pun,0,1);
}
niz[i] = '\n'; //zadnji znak za kraj niza
printf("[PO]\tPotrosac gotov, primio: %s\n", niz);
}
void brisi(int sig){
(void) shmdt((char *) medjuspremnik);
(void) shmctl(Id, IPC_RMID, NULL);
exit(0);
}
int main(void){
int i, pid;
Id = shmget(IPC_PRIVATE, sizeof(MS_VEL)*100, 0600);
if (Id == -1) exit(1);
medjuspremnik = (struct zajednicki_ *) shmat(Id, NULL, 0);
sigset(SIGINT, brisi);
pisi = semget(IPC_PRIVATE,1,0600);
pun = semget(IPC_PRIVATE,1,0600);
prazan = semget(IPC_PRIVATE,1,0600);
SemSetVal(pisi,0,1);
SemSetVal(pun,0,5);
SemSetVal(prazan,0,5);
medjuspremnik->ULAZ=medjuspremnik->IZLAZ=0;
for(i=0;i<2;i++)
{
pid=fork();
switch (pid){
case 0:
proizvodjac(i);
exit(0);
case -1:
printf("Ne mogu stvorit proces");
exit(0);
}
pid=fork();
switch (pid){
case 0:
potrosac();
exit(0);
case -1:
printf("Ne mogu stvorit proces");
exit(0);}
}
for(i=2;i>=0;i--) wait(NULL);
semctl(pisi, 0, IPC_RMID);
semctl(pun, 0, IPC_RMID);
semctl(prazan, 0, IPC_RMID);
return 0;
}