Forum » Programiranje » [C] Semafor
[C] Semafor
Ciklamen ::
Pozdravljeni.
Že dalj časa se zafrkavam z nalogo za faks, pa mi nikakor ne uspe naredit..
Naloga se glasi:
shm1a
program shm1a ustvari še en skupen pomnilnik, ki bo sprejel niz dolg 20 znakov,
nato v vrtavki "počaka", da mu proces shm1b sporoči, da je napolnil drugi skupni pomnilnik s "pametnimi" podatki,
preden se zaključi, izpiše na zaslon podatke iz drugega skupnega pomnilnika.
shm1b
poveže se na nov skupni pomnilnik in ga napolni z razumljivimi podatki (niz naj bo dolg cca 20 znakov, kot je velik skupni pomnilnik),
"sporoči" prejšnjemu procesu, da je končal z operacijo (ostane enako kot prejšnji teden).
Nato ponovno napišite dva programa (shm2a in shm2b), kjer popolnoma enak problem rešite s pomočjo semaforja. Namig: prvi (signalni) skupni pomnilnik in vrtavko nadomestite s semaforjem.
shm1a in shm1b imam narejena, problem se mi sedaj pojavlja pri shm2a (prejšnji teden je še delalo ok?) ko mi ne ustvarja semaforja/skupnega pomnilnika
evo še koda:
SHM2A
SHM2B
Če bi mi lahko kdo pomagal pri omenjeni nalogi bi bil neskončno hvaležen, ker sam je ne uspem razrešit...
Naj še enkrat povem, prejšnji teden mi je shm2a delal normalno, nisem popolnoma nič spreminjal v kodi, sedaj pa mi ne dela..
Že dalj časa se zafrkavam z nalogo za faks, pa mi nikakor ne uspe naredit..
Naloga se glasi:
shm1a
program shm1a ustvari še en skupen pomnilnik, ki bo sprejel niz dolg 20 znakov,
nato v vrtavki "počaka", da mu proces shm1b sporoči, da je napolnil drugi skupni pomnilnik s "pametnimi" podatki,
preden se zaključi, izpiše na zaslon podatke iz drugega skupnega pomnilnika.
shm1b
poveže se na nov skupni pomnilnik in ga napolni z razumljivimi podatki (niz naj bo dolg cca 20 znakov, kot je velik skupni pomnilnik),
"sporoči" prejšnjemu procesu, da je končal z operacijo (ostane enako kot prejšnji teden).
Nato ponovno napišite dva programa (shm2a in shm2b), kjer popolnoma enak problem rešite s pomočjo semaforja. Namig: prvi (signalni) skupni pomnilnik in vrtavko nadomestite s semaforjem.
shm1a in shm1b imam narejena, problem se mi sedaj pojavlja pri shm2a (prejšnji teden je še delalo ok?) ko mi ne ustvarja semaforja/skupnega pomnilnika
evo še koda:
SHM2A
#include<stdio.h> #include<stdlib.h> #include<sys/shm.h> #include<sys/sem.h> int main() { int shmid, sem_id; char* k; struct sembuf sem; shmid=shmget(1004, sizeof(20), IPC_EXCL|IPC_CREAT|0600); if(shmid<0) { printf("Napaka shmid!\n"); } else { printf("OK\n"); } k=(char*)shmat(shmid,(void*)0,0); if(k==(char*)-1) { printf("Napaka k!\n"); } else { printf("OK\n"); } k=""; sem_id=semget(1005,1,IPC_CREAT|IPC_EXCL|0600); if(sem_id<0) { printf("Napaka sem_id!\n"); } else { printf("OK\n"); } semctl(sem_id,0,SETVAL,1); sem.sem_flg=0; sem.sem_num=0; sem.sem_op=-1; semop(sem_id,&sem,1); printf(k); sem.sem_op=1; semop(sem_id,&sem,1); semctl(sem_id,0,IPC_RMID); shmctl(shmid,IPC_RMID,0); shmdt(k); return 0; }
SHM2B
#include<stdio.h> #include<stdlib.h> #include<sys/shm.h> #include<sys/sem.h> int main() { int shmid, sem_id; char* k; struct sembuf sem; shmid=shmget(1004,0,0); if(shmid<0) { printf("Napaka shmid!\n"); } else { printf("OK\n"); } k=(char*)shmat(shmid,(void*)0,0); if(k==(char*)-1) { printf("Napaka k!\n"); } else { printf("OK\n"); } sem_id=semget(1005,0,0); if(sem_id<0) { printf("Napaka sem_id\n"); return 1; } else { printf("OK\n"); } semctl(sem_id,0,SETVAL,1); sem.sem_op=-1; sem.sem_flg=0; sem.sem_num=0; semop(sem_id,&sem,1); k="Niz dolg 20 znakov.."; sem.sem_op=-1; semop(sem_id,&sem,1); shmdt(k); return 0; }
Če bi mi lahko kdo pomagal pri omenjeni nalogi bi bil neskončno hvaležen, ker sam je ne uspem razrešit...
Naj še enkrat povem, prejšnji teden mi je shm2a delal normalno, nisem popolnoma nič spreminjal v kodi, sedaj pa mi ne dela..
- End of the Post ->
Qcube ::
Nisem nikoli programiral semaforjev, samo iz firbca me je zanimalo kako delujejo. Imam shranjena dva zaznamka s primeri kode, če ti kaj pomaga pri iskanju napake.
http://beej.us/guide/bgipc/output/html/...
http://snap.nlc.dcccd.edu/learn/fuller3...
http://beej.us/guide/bgipc/output/html/...
http://snap.nlc.dcccd.edu/learn/fuller3...
Ciklamen ::
Qcube hvala, imamo tudi na strani za vaje literaturo, ampak i fail to see where the problem is..
- End of the Post ->
Ciklamen ::
OK ker ne morem editirat več svojega prejšnjega posta...uspelo mi je sestavit tak daleč, da dela shm2a, ne dela pa shm2b (nek problem je s semaforjem - izpiše mi "napaka sem_id")
evo kodi še enkrat:
shm2a
Shm2b
evo kodi še enkrat:
shm2a
#include<stdio.h> #include<stdlib.h> #include<sys/shm.h> #include<sys/sem.h> #include<sys/types.h> #include<sys/ipc.h> #include<string.h> int main() { int shmid, sem_id; char* k; struct sembuf sem; shmid=shmget(1005, sizeof(20), IPC_CREAT|IPC_EXCL|0600); if(shmid<0) { printf("Napaka shmid!\n"); } else { printf("OK\n"); } k=(char*)shmat(shmid,(void*)0,0); if(k==(char*)-1) { printf("Napaka k!\n"); } else { printf("OK\n"); } strcpy(k,""); sem_id=semget(1006,1,IPC_EXCL|IPC_CREAT|0600); if(sem_id<0) { printf("Napaka sem_id!\n"); } else { printf("OK\n"); } semctl(sem_id,0,SETVAL,1); sem.sem_flg=0; sem.sem_num=0; sem.sem_op=0; semop(sem_id,&sem,1); sem.sem_op=-1; semop(sem_id,&sem,1); printf("V pomnilniku: %s\n ",k); sem.sem_op=1; semop(sem_id,&sem,1); shmdt(k); shmctl(shmid,IPC_RMID,0); semctl(sem_id,0,IPC_RMID); return 0; }
Shm2b
#include<stdio.h> #include<stdlib.h> #include<sys/shm.h> #include<sys/sem.h> #include<sys/types.h> #include<sys/ipc.h> #include<string.h> int main() { int shmid, sem_id; char* k; struct sembuf sem; shmid=shmget(1005,0,0); if(shmid<0) { printf("Napaka shmid!\n"); } else { printf("OK\n"); } k=(char*)shmat(shmid,(void*)0,0); if(k==(char*)-1) { printf("Napaka k!\n"); } else { printf("OK\n"); } sem_id=semget(1005,1,0600); if(sem_id<0) { printf("Napaka sem_id\n"); } else { printf("OK\n"); } semctl(sem_id,0,SETVAL,1); sem.sem_op=-1; sem.sem_flg=0; sem.sem_num=0; semop(sem_id,&sem,1); strcpy(k,"niz dolg 20 znakov.."); sem.sem_op=1; semop(sem_id,&sem,1); shmdt(k); return 0; }
- End of the Post ->
Zgodovina sprememb…
- spremenil: Ciklamen ()
Jean-Paul ::
shm2a:
shmid=shmget(1005, sizeof(20), IPC_CREAT|IPC_EXCL|0600); -> shmid=shmget(1005, 21, IPC_CREAT|IPC_EXCL|0600);
shm2b:
sem_id=semget(1005,1,0600); -> sem_id=semget(1006,1,0600);
shmid=shmget(1005, sizeof(20), IPC_CREAT|IPC_EXCL|0600); -> shmid=shmget(1005, 21, IPC_CREAT|IPC_EXCL|0600);
shm2b:
sem_id=semget(1005,1,0600); -> sem_id=semget(1006,1,0600);
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Kako narediti request z "\" v URL-juOddelek: Programiranje | 2128 (1403) | Horejšio |
» | Niti - segmentation faultOddelek: Programiranje | 1964 (811) | galu |
» | [C] Sinhronizacija procesovOddelek: Programiranje | 1126 (999) | Cvenemir |
» | skupni pomnilnik © linuxOddelek: Programiranje | 2475 (2321) | Keki |
» | Problem pri uporabi niti (threade) C++Oddelek: Programiranje | 1034 (889) | rabbit-zek |