pomoč pri semaforjih

Robert01 Član
uredil/-a 8. September, 2008 v Programiranje
mam en problem z nalogo s semaforji in nwm kak se je naj lotim :( oz če kdo zna bi prosil da jo resi

Napišite program proizvajalecPotrosnik.c, kjer podamo argument m (m>10) in predstavlja število proizvodov. Pri nalogi najprej realizirajte funkciji W(id) in S(id). S funkcijo W(id) vstopimo v kritično sekcijo, s funkcijo S(id) izstopimo iz kritične sekcije (pri vsakem branju in pisanju). Funkciji W in S realizirajte z uporabo semaforjev, pri čemer je id identifikator semaforja, ki ga uporabljamo. V skupnem pomnilniku imejte naslednjo strukturo (vaš kritični odsek) (uporabite funkcije za delo s skupnim pomnikom):

Komentarji

  • napsy Član Ubuntu.si
    najprej si preberi
    http://en.wikipedia.org/wiki/Semaphore_(programming)

    S semaforji ščitiš neko podatkovno strukturo. Najlažje je, da narediš mutex. Ta mutex bo vklopljen vedno, kadar bo neka funkcija posegala po skupnem resourcu. In če bodo druge funkcije med tem časom tudi želele posegati, bodo morale počakati, da trenutna funkcija zaklenjen resource odklene.
  • Robert01 Član
    uredil/-a 10. September, 2008
    mam en problem pri tem programu, izpiše mi namres Segmentation fault. zdaj pa nwm kjer me zajebavle program

    #include
    #include
    #include
    #include
    #include
    #include

    struct sembuf sops;
    int semid;
    int shmid;

    void W(int id)
    {
    sops.sem_num=0;
    sops.sem_op=-1;
    sops.sem_flg=0;

    semop(semid, &sops, 1); /*tukaj vstopimo v kritično odsek*/
    }

    void S(int id)
    {
    sops.sem_num=0;
    sops.sem_op=1;
    sops.sem_flg=0;

    semop(semid, &sops, 1); /*izstopimo iz kritičnega odseka*/
    }
    struct skupna_struktura
    {
    int vrhVmesnika;
    int vmesnik[3];
    int koncano;
    };
    void ustvari_pomn()
    {
    int shmid;
    shmid = shmget(1234,1*sizeof(struct skupna_struktura),IPC_CREAT | 0600);


    }
    void ustvari_sem()
    {
    semid = semget(4321,1,IPC_EXCL|IPC_CREAT|0600);
    semctl(semid, 0, SETVAL,1); /*semaforju priredimo vrednost 1*/
    }
  • napsy Član Ubuntu.si
    sesuje se ti v vrstici 65 (st->koncano = 0) kar je verjetno posledica, da se struktura st ne alocira. to pa verjetno pomeni, da funkcija shmat() vrne namesto pointerja vrednost -1. Vrednost errno je nastavljena na "Identifier removed", če ti kaj pomaga.
  • napsy Član Ubuntu.si
    Prvi parameter (torej shmid) pri funkciji shmat() dobiš preko druge funkcije shmget().
  • kako bi lahko v tem primeru resil?
  • napsy Član Ubuntu.si
    glej prejšnji post
  • sem probal s tem semid = semget(1234, 0, 0); pa mi ne gre :(
  • napsy Član Ubuntu.si
    poglej si dokumentacijo za shmget()
Za komentiranje se prijavite ali pa se vpišite.