Forum » Programiranje » [C] Sinhronizacija procesov
[C] Sinhronizacija procesov

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 ()

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.

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.

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

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 | 2006 (853) | galu |
» | [C++] problem z binarnimi datotekamiOddelek: Programiranje | 969 (834) | mallard |
» | [C] struct in int[] (strani: 1 2 )Oddelek: Programiranje | 7545 (6618) | MrBrdo |
» | skupni pomnilnik © linuxOddelek: Programiranje | 2525 (2371) | Keki |
» | [C++ naloga] seznamOddelek: Programiranje | 1406 (1406) | BigWhale |