Forum » Programiranje » skupni pomnilnik © linux
skupni pomnilnik © linux
![](https://static.slo-tech.com/stili/avatar_gray.gif)
roba87 ::
imam težavo pri nalogi :
Napišite dva programa (shm1a.c in shm1b.c), ki medsebojno komunicirata preko skupnega pomnilnika.
Naloge prvega programa (shm1a.c), ki se izvajajo v zapisanem zaporedju, so naslednje:
* Ustvari skupen pomnilnik, ki je velik 1 celo število (int).
* Vrednost skupnega pomnilnika postavi na 0.
* Izvaja prazno while zanko dokler je vrednost iz skupnega pomnilnika 0 (temu pravimo tudi "spinlock" oz. "vrtavka").
* Ko se vrednost v skupnem pomnilniku spremeni oz. je različna 0, program poskuša pobrisati skupen pomnilnik.
Naloge drugega programa (shm1b.c), ki ga zaženemo vedno za prvim, so:
* V skupen pomnilnik, ki ga je že ustvaril prvi program, zapiše svoj PID.
* Poskuša pobrisati skupen pomnilnik.
Ko končata izvajanje oba programa, skupnega pomnilnika na sistemu ne sme več biti. V to se lahko prepričate s programom ipcs.
Kot ključ, s katerim ustvarjamo skupen pomnilnik, uporabite vašo vpisno številko E1000000, kjer odstranite prvi znak 'E'.
program :
Problem je v tem da se shm1a nikoli ne konča. Nekaj sem poskušal med while (kazalec==0) {} vstavljat pa mi ni uspelo.
Napišite dva programa (shm1a.c in shm1b.c), ki medsebojno komunicirata preko skupnega pomnilnika.
Naloge prvega programa (shm1a.c), ki se izvajajo v zapisanem zaporedju, so naslednje:
* Ustvari skupen pomnilnik, ki je velik 1 celo število (int).
* Vrednost skupnega pomnilnika postavi na 0.
* Izvaja prazno while zanko dokler je vrednost iz skupnega pomnilnika 0 (temu pravimo tudi "spinlock" oz. "vrtavka").
* Ko se vrednost v skupnem pomnilniku spremeni oz. je različna 0, program poskuša pobrisati skupen pomnilnik.
Naloge drugega programa (shm1b.c), ki ga zaženemo vedno za prvim, so:
* V skupen pomnilnik, ki ga je že ustvaril prvi program, zapiše svoj PID.
* Poskuša pobrisati skupen pomnilnik.
Ko končata izvajanje oba programa, skupnega pomnilnika na sistemu ne sme več biti. V to se lahko prepričate s programom ipcs.
Kot ključ, s katerim ustvarjamo skupen pomnilnik, uporabite vašo vpisno številko E1000000, kjer odstranite prvi znak 'E'.
program :
// shm1a #include <sys/shm.h> #include <unistd.h> #include <stdio.h> #include <sys/ipc.h> #include <sys/types.h> #include <errno.h> int main() { int *kazalec; int pom; int shmid; shmid = shmget (1000000, 1*sizeof(int), IPC_CREAT | IPC_EXCL | 0600); if(shmid<0) { perror ( "error" ); printf ( "napaka : %d\n ", errno); } else { printf ( "ni napake\n" ); } kazalec = (int*)shmat(shmid,(void*)0, 0); if(kazalec==(int*)-1) { perror ( "ni kazalca" ); return -1; } kazalec = 0; while (kazalec==0) { } shmdt(kazalec); if(pom<0) { perror ( "error" ); return -1; } pom = shmctl(shmid, IPC_RMID,0); if(pom!=0) { printf ( "skupni pomnilnik izbrisan" ); } else { return (errno); } return 0; } //shm1b : #include <sys/shm.h> #include <unistd.h> #include <stdio.h> #include <sys/ipc.h> #include <sys/types.h> #include <errno.h> int main() { int shmid; int pom; int *kazalec; shmid = shmget(1000000, 1*sizeof(int), IPC_CREAT | 0600); kazalec = (int *) shmat(shmid, (void *)0, 0); *kazalec = getpid(); shmdt(kazalec); pom = shmctl (shmid, IPC_RMID,0); if (pom!=0) { printf ( "pomnilnik zbrisan" ); } return 0; }
Problem je v tem da se shm1a nikoli ne konča. Nekaj sem poskušal med while (kazalec==0) {} vstavljat pa mi ni uspelo.
- spremenil: Senitel ()
![](https://static.slo-tech.com/stili/bel_non_grata.png)
krneki0001 ::
Ker vidim, da sva ali sošolca na izrednem, ali pa si na rednem faks v mariboru, ti bom mal pomagal
shm1a.c
shm1b.c
shm1a.c
#include <sys/shm.h> #include <errno.h> int main() { int shmid; int* kazalec; shmid=shmget(1000000,sizeof(int),IPC_CREAT | 0600); printf("Izvajanje shm1a\n"); kazalec=(int *)shmat(shmid,(void *)0, 0); *kazalec=0; while (*kazalec==0) { } if (shmid<0) { perror("Napaka"); return(errno); } int i=shmctl(shmid,IPC_RMID,0); if (i==0) { printf("Skupni pomnilnik smo pobrisali\n"); } else { return(errno); } shmdt(kazalec); shmctl(shmid,IPC_RMID,0); }
shm1b.c
#include <sys/shm.h> #include <errno.h> int main() { int shmid; int* kazalec; printf("Izvajanje shm1b\n"); shmid=shmget(10000000,0, 0); if (shmid<0) { perror("Napaka: Proces ne obstaja."); return(errno); } kazalec=(int *)shmat(shmid,(void *)0, 0); if (kazalec==(void *)-1) { perror("Ni kazalca"); return -1; } *kazalec=getpid(); if (shmid<0) { perror("Napaka"); return(errno); } int i=shmctl(shmid,IPC_RMID,0); if (i==0) { printf("Skupni pomnilnik je pobrisan!\n"); } else { return(errno); } shmdt(kazalec); shmctl(shmid,IPC_RMID,0); }
Zgodovina sprememb…
- spremenil: Senitel ()
![](https://static.slo-tech.com/stili/bel_non_grata.png)
krneki0001 ::
Kok si pisal vmesni izpit in zagovor vaj? Jst imam zdej 300 pik, še 100 od vaj(ni še napisal rezultatov) in še 200 od seminarske pa 29 avgusta sploh ne grem pisat drugega izpita, če jih bom 600 nabral.
![](https://static.slo-tech.com/stili/avatar_gray.gif)
roba87 ::
uh, hvala ti lepa. Zgleda da sma sošolca pri tem predmetu :) . Jaz mam 192 semiarsko pa vaje mam zdaj nekje 100 (manjka mi še 3 sklop - to je minimum 45), na izpit pa še ne morem ker nimam vaj oddanih vseh (nisem šel na kolokvije).
Zgodovina sprememb…
- spremenil: roba87 ()
![](https://static.slo-tech.com/stili/bel_non_grata.png)
krneki0001 ::
Si redni? Jst sm izredni, ampak vaje imamo očitno enake, ker mi moramo oddat seminarsko šele do konca tega tedna.
Če še ktero vajo rabiš, jo lahko tut postam.
Če še ktero vajo rabiš, jo lahko tut postam.
Zgodovina sprememb…
- spremenilo: krneki0001 ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Niti - segmentation faultOddelek: Programiranje | 2004 (851) | galu |
» | c++ fork()Oddelek: Programiranje | 1403 (719) | Randomness |
» | [C] Sinhronizacija procesovOddelek: Programiranje | 1160 (1033) | Cvenemir |
» | ne zazna 3 G ramov ampak 2558 zakaj ??Oddelek: Pomoč in nasveti | 3054 (2516) | Zheegec |
» | Problem pri uporabi niti (threade) C++Oddelek: Programiranje | 1067 (922) | rabbit-zek |