Forum » Programiranje » [C] Sinhronizacija procesov
[C] Sinhronizacija procesov
![](https://static.slo-tech.com/stili/avatar_gray.gif)
Cvenemir ::
Lep pozdrav.
Težave imam pri sinhronizaciji, in sicer mi shm1b preko spinlocka sporoči, da lahko shm1a nadaljuje in šele nato skopira podatke v pomnilnik, kar bi pomoje moralo delovati ravno obratno. Kar nekaj časa že poskušam rešiti težavo, a se mi ne posveti.
shm1a
shm1b
Težave imam pri sinhronizaciji, in sicer mi shm1b preko spinlocka sporoči, da lahko shm1a nadaljuje in šele nato skopira podatke v pomnilnik, kar bi pomoje moralo delovati ravno obratno. Kar nekaj časa že poskušam rešiti težavo, a se mi ne posveti.
shm1a
#include <stdio.h> #include <stdlib.h> #include <sys/shm.h> #include <sys/sem.h> #include <errno.h> #include <sched.h> #include <string.h> #include <unistd.h> int main() { /* Deklaracija spremenljivk */ int skupniPomnilnik; int skupniPomnilnik2; int* pomnilnik; char* pomnilnik2; /* Ustvarimo prvi skupni pomnilnik */ skupniPomnilnik = shmget(1059816, 1*sizeof(int), IPC_CREAT | IPC_EXCL | 0600); if(skupniPomnilnik < 0) { perror("Napaka. Pomnilnik ni ustvarjen."); return(errno); } /* Ustvarimo drugi skupni pomnilnik */ skupniPomnilnik2 = shmget(1059817, 21*sizeof(char), IPC_CREAT | IPC_EXCL | 0600); if(skupniPomnilnik2 < 0) { perror("Napaka. Pomnilnik 2 ni ustvarjen."); return(errno); } /* Ustvarimo prvi kazalec na skupni pomnilnik */ pomnilnik = (int*)shmat(skupniPomnilnik, (void*)0, 0); if(pomnilnik == (int*)-1) { perror("Ni kazalca!"); return -1; } /* Ustvarimo drugi kazalec na skupni pomnilnik 2 */ pomnilnik2 = (char*)shmat(skupniPomnilnik2, (void*)0, 0); if(pomnilnik2 == (char*)-1) { perror("Ni kazalca!"); return -1; } *pomnilnik = 0; /* Spinlock*/ while(*pomnilnik == 0) { } /* Izpis */ printf("%s\n", pomnilnik2); /* Odklopimo pomnilnika */ shmdt(pomnilnik); shmdt(pomnilnik2); /* Brisanje pomnilnikov */ int brisi1; int brisi2; brisi1 = shmctl(skupniPomnilnik, IPC_RMID, 0); brisi2 = shmctl(skupniPomnilnik2, IPC_RMID, 0); if(brisi1 == 0) { printf("Izbrisano!"); } if(brisi2 == 0) { printf("Izbrisano!"); } return 0; }/* Konec programa shm1a */
shm1b
#include <stdio.h> #include <stdlib.h> #include <sys/shm.h> #include <sys/sem.h> #include <errno.h> #include <sched.h> #include <string.h> #include <unistd.h> int main() { /* Definicija spremenljivk ipd.... */ char znaki[] = "!!!!!!!!!!!!!!!!!!!!\0"; int skupniPomnilnik; int skupniPomnilnik2; int* pomnilnik; char* pomnilnik2; /* Ustvarimo prvi pomnilnik */ skupniPomnilnik = shmget(1059816, 0, 0); if(skupniPomnilnik < 0) { perror("Napaka!"); return(errno); } /* ustvarimo drugi pomnilnik */ skupniPomnilnik2 = shmget(1059817, 0, 0); if(skupniPomnilnik2 < 0) { perror("Napaka!"); return(errno); } /* Prvi kazalec */ pomnilnik = (int*)shmat(skupniPomnilnik, (void*)0, 0); if(pomnilnik == (int*)-1) { perror("Ni kazalca!"); return -1; } /* Drugi kazalec */ pomnilnik2 = (char*)shmat(skupniPomnilnik2, (void*)0, 0); if(pomnilnik2 == (void*)-1) { perror("Ni kazalca!"); return -1; } *pomnilnik = getpid(); /* Skopiramo znake v pomnilnik 2 */ strcpy(pomnilnik2, znaki); /* Odklopimo pomnilnika */ shmdt(pomnilnik); shmdt(pomnilnik2); /* Brisanje pomnilnikov */ int brisi1; int brisi2; brisi1 = shmctl(skupniPomnilnik, IPC_RMID, 0); brisi2 = shmctl(skupniPomnilnik2, IPC_RMID, 0); if(brisi1 == 0) { printf("Izbrisano!\n"); } if(brisi2 == 0) { printf("Izbrisano!\n"); } return 0; }/* Konec programa smh1b */
- poskusil klonirati: Cvenemir ()
![](https://static.slo-tech.com/stili/avatar_gray.gif)
bi0s ::
Prvo vpiši znake v pomnilnik2, nato vpiši PID v pomnilnik1. Sedaj se ti vpiše PID v shm1b, se neha spinlock, in nima kaj za izpisat.
![](https://static.slo-tech.com/stili/avatar.gif)
c0dehunter ::
Si poskusil v shm1a namesto namesto pomnilnik2 izpisati kar nek string, da vidiš če sploh dela? Lahko da je pomnilnik2 prazen.
I do not agree with what you have to say,
but I'll defend to the death your right to say it.
but I'll defend to the death your right to say it.
![](https://static.slo-tech.com/stili/avatar_gray.gif)
amacar ::
Nekak tak je šlo meni skos na vajah:
shm1a.c
shm1b.c
shm1a.c
#include <stdio.h> #include <stdlib.h> #include <sys/shm.h> #include <errno.h> int main() { int shmid; int* kazalec; shmid=shmget(1043444,sizeof(int),IPC_CREAT | IPC_EXCL |0600); if (shmid<0) { perror("Napaka"); return(errno); } kazalec=(int *)shmat(shmid,(void *)0, 0); if (kazalec==(int *)-1) { perror("Nisem dobil kazalca"); return -1; } *kazalec=0; /*v pomnilnik vpišemo 0*/ while(*kazalec==0) { /*ne delaj nič*/ } int i=shmdt(kazalec); if (i<0) { perror("Napaka"); return -1; } i=shmctl(shmid,IPC_RMID,0); if (i==0) { printf("Skupni pomnilnik je zbrisan!\n"); } else { return(errno); } return 0; }
shm1b.c
#include <stdio.h> #include <stdlib.h> #include <sys/shm.h> #include <errno.h> int main() { int shmid; int* kazalec; shmid=shmget(1043444,0, 0); if (shmid<0) { perror("Pozeni najprej shm1a"); return(errno); } kazalec=(int *)shmat(shmid,(void *)0, 0); if (kazalec==(int *)-1) { perror("Nisem dobil kazalca"); return -1; } *kazalec=getpid(); int i=shmdt(kazalec); if (i<0) { perror("Napaka"); return -1; } i=shmctl(shmid,IPC_RMID,0); if (i==0) { printf("Skupni pomnilnik je zbrisan!\n"); } else { return(errno); } return 0; }
![](https://static.slo-tech.com/stili/avatar_gray.gif)
Cvenemir ::
Lp. Zanima me, zakaj se mi spinlock v shm1a ne zaključi, ko v shm1b v pomnilnik zapišem 1(vrstica 58).
shm1a:
shm1b
shm1a:
#include <stdio.h> #include <stdlib.h> #include <sys/shm.h> #include <sys/sem.h> #include <errno.h> #include <sched.h> #include <string.h> #include <unistd.h> int main() { /* Deklaracija spremenljivk */ int skupniPomnilnik; int skupniPomnilnik2; int* pomnilnik; char* pomnilnik2; int i; /* Ustvarimo prvi skupni pomnilnik */ skupniPomnilnik = shmget(1059816, 1*sizeof(int), IPC_CREAT | IPC_EXCL | 0600); if(skupniPomnilnik < 0) { perror("Napaka. Pomnilnik ni ustvarjen."); return(errno); } /* Ustvarimo drugi skupni pomnilnik */ skupniPomnilnik2 = shmget(1059817, 20*sizeof(char), IPC_CREAT | IPC_EXCL | 0600); if(skupniPomnilnik2 < 0) { perror("Napaka. Pomnilnik 2 ni ustvarjen."); return(errno); } /* Ustvarimo prvi kazalec na skupni pomnilnik */ pomnilnik = (int*)shmat(skupniPomnilnik, (void*)0, 0); if(pomnilnik == (int*)-1) { perror("Ni kazalca!"); return -1; } /* Ustvarimo drugi kazalec na skupni pomnilnik 2 */ pomnilnik2 = (char*)shmat(skupniPomnilnik2, (void*)0, 0); if(pomnilnik2 == (char*)-1) { perror("Ni kazalca!"); return -1; } *pomnilnik = 0; /* Spinlock*/ while(*pomnilnik == 0) { } /* Izpis */ for(i=0; i<20; i++) { printf("%c\n",pomnilnik2[i]); } /* Odklopimo pomnilnika */ shmdt(pomnilnik); shmdt(pomnilnik2); /* Brisanje pomnilnikov */ int brisi1; int brisi2; brisi1 = shmctl(skupniPomnilnik, IPC_RMID, 0); brisi2 = shmctl(skupniPomnilnik2, IPC_RMID, 0); if(brisi1 == 0) { printf("Izbrisano!"); } if(brisi2 == 0) { printf("Izbrisano!"); } return 0; }/* Konec programa shm1a */
shm1b
#include <stdio.h> #include <stdlib.h> #include <sys/shm.h> #include <sys/sem.h> #include <errno.h> #include <sched.h> #include <string.h> #include <unistd.h> int main() { /* Definicija spremenljivk ipd.... */ int skupniPomnilnik; int skupniPomnilnik2; int* pomnilnik; char* pomnilnik2; int i; /* Ustvarimo prvi pomnilnik */ skupniPomnilnik = shmget(1059816, 0, 0); if(skupniPomnilnik < 0) { perror("Napaka!"); return(errno); } /* ustvarimo drugi pomnilnik */ skupniPomnilnik2 = shmget(1059817, 0, 0); if(skupniPomnilnik2 < 0) { perror("Napaka!"); return(errno); } /* Prvi kazalec */ pomnilnik = (int*)shmat(skupniPomnilnik, (void*)0, 0); if(pomnilnik == (int*)-1) { perror("Ni kazalca!"); return -1; } /* Drugi kazalec */ pomnilnik2 = (char*)shmat(skupniPomnilnik2, (void*)0, 0); if(pomnilnik2 == (void*)-1) { perror("Ni kazalca!"); return -1; } /* Skopiramo znake v pomnilnik 2 */ for(i=0; i<20; i++) { pomnilnik2[i]='*'; } /* Ustavimo vrtavko */ *pomnilnik = 1; /* Odklopimo pomnilnika */ shmdt(pomnilnik); shmdt(pomnilnik2); /* Brisanje pomnilnikov */ int brisi1; int brisi2; brisi1 = shmctl(skupniPomnilnik, IPC_RMID, 0); brisi2 = shmctl(skupniPomnilnik2, IPC_RMID, 0); if(brisi1 == 0) { printf("Izbrisano!\n"); } if(brisi2 == 0) { printf("Izbrisano!\n"); } return 0; }/* Konec programa shm1b */
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Niti - segmentation faultOddelek: Programiranje | 1909 (756) | galu |
» | [C++] problem z binarnimi datotekamiOddelek: Programiranje | 893 (758) | mallard |
» | [C] struct in int[] (strani: 1 2 )Oddelek: Programiranje | 7016 (6089) | MrBrdo |
» | skupni pomnilnik © linuxOddelek: Programiranje | 2437 (2283) | Keki |
» | [C++ naloga] seznamOddelek: Programiranje | 1354 (1354) | BigWhale |