Zadatak u C-u na UNIXU

poruka: 3
|
čitano: 2.779
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
Zadatak u C-u na UNIXU

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;
}

 
0 0 hvala 0
16 godina
neaktivan
offline
RE: Zadatak u C-u na UNIXU

Rješeno! Hvala svejedno!

15 godina
neaktivan
offline
RE: Zadatak u C-u na UNIXU

Pozdrav!

 

Mozeš li postati onda ispravljenju verziju? Pls

1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice