snazim sa pouzit semafory na jednoduchu synchronizaciu dvoch procesov, teda proces child vykona hlavnu vetvu ifu, kde sa zastavi na sem_wait(&mutex), takze pokracuje forknuty proces druhou vetvou, ktora najprv pripravi na odokmnutie semafor pre prvy proces, nastavi podmienku na ukoncenie nekonecneho cyklu (ktory kontroluje, ci je mutex otvoreny) a nakoniec odomkne mutex a semafor (vid kod)... Problem je v tom, ze nedojde k odomknutiu tohto mutexu (resp zvysi sa jeho hodnota, ale prvy proces "akoby o tom nevedel"). Snazil som sa to vyriesit aj pomocou zdielanej pamate, do ktorej by som ulozil semafory, ale nepomohlo..
Kód: Vybrať všetko
int main(int argc, char *argv[]) {
int value;
pid_t child;
child = fork();
sem_t semafor;
sem_t mutex;
sem_init(&semafor,0,0);
sem_init(&mutex,0,0);
int *counter;
key_t key1 = ftok(argv[0], 98); //vytvo�en� kl��e
int shmid1 = shmget(key1, sizeof(int), IPC_CREAT | 0666);
counter= shmat(shmid1, NULL, 0);
(*counter)=1;
setbuf(stdout,NULL);
if(child == 0)
{ //cast kodu vykonavana prvym procesom
while(1)
{
fprintf(stdout,"tohle je if\n");
sem_getvalue(&semafor, &value);
fprintf(stdout,"The value of the semaphors is %d\n", value);
sem_wait(&mutex);
sem_wait(&semafor);
fprintf(stdout,"odemknul jsem semafor\n");
if (*counter==0) break;
} //koniec
} else
{//cast kodu vykonavana druhym procesom
fprintf(stdout,"odemknuto\n");
sem_post(&semafor);
*counter=0;
sem_getvalue(&semafor, &value);
sem_post(&mutex);
}//koniec
}