Czy ktoś byłby w stanie krok po kroku omówić mi następujący programy?
Są to tzw. "Problem 5 filozofów" , oraz "Lotnisko"
#include
#include
#include
#include
#include
#include
#define semflag 0777
key_t klucz;
int semid;
void sem_wait(int id)
{
static struct sembuf buf={0,-1,0};
buf.sem_num=id;
if(semop(semid,&buf,1)==-1)
{
perror("ERRSEM:wait");
exit(1);
}
}
void sem_signal(int id)
{
static struct sembuf buf={0,1,0};
buf.sem_num=id;
if(semop(semid,&buf,1)==-1)
{
perror("ERRSEM:signal");
exit(1);
}
}
void podnies_widelec(int id)
{
sem_wait(id);
}
void odluz_widelec(int id)
{
sem_signal(id);
}
void usiadz_lokaj()
{
sem_wait(5);//
}
void odejdz_lokaj()
{
sem_signal(5);
}
int sem_init()
{
int i,status=0;
if((semid=semget(klucz, 6, semflag|IPC_CREAT|IPC_EXCL))==-1)//tworzymy zestaw zlozony z 6 semaforow 5 filozofow + lokaj
{
if(errno==EEXIST)
semid=semget(klucz,6,0);
}
for(i=0;i0);
semctl(semid,0,IPC_RMID,0);
exit(0);
}
LOTNISKO
#include
#include
#include
#include
#include
#include
#define Ar 4
#define N 20
#define K 1
static struct sembuf buf;
int na_lotnisku,w_powietrzu;
void samolot(int semid,int id)
{
while(1)
{
printf("Samolot %d: latam\n",id);
sleep(5);
printf("Samolot %d: czekam na zezwolenia na lądowanie\n",id);
buf.sem_num=0;
buf.sem_op=-1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Próba lądowania");
exit(1);
}
buf.sem_num=1;
buf.sem_op=-1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Zajmowanie pasa");
exit(1);
}
printf("Samolot %d: ląduje\n",id);
na_lotnisku=N-semctl(semid,0,GETVAL,0);
w_powietrzu==Ar-na_lotnisku;
printf("lotniskowiec: %d w powietrzu: %d\n",na_lotnisku,w_powietrzu);
sleep(2);
buf.sem_num=1;
buf.sem_op=1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Zwalnnianie pasa");
exit(1);
}
printf("Samolot %d: na lotniskowcu\n",id);
sleep(15);
printf("Samolot %d: czekam na zezwolenia na start\n",id);
buf.sem_num=1;
buf.sem_op=-1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Zajmowanie pasa");
exit(1);
}
printf("Samolot %d: startuje\n",id);
na_lotnisku=N-semctl(semid,0,GETVAL,0);
w_powietrzu==Ar-na_lotnisku;
printf("lotniskowiec: %d w powietrzu: %d\n",na_lotnisku,w_powietrzu);
sleep(2);
buf.sem_num=1;
buf.sem_op=1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Zwalnnianie pasa");
exit(1);
}
buf.sem_num=0;
buf.sem_op=1;
buf.sem_flg=0;
if(semop(semid,&buf,1)==-1)
{
perror("Próba startowania");
exit(1);
}
}
}
int main(int arc,char **argv)
{
key_t klucz=ftok("/tmp",'a');
int i,semid=semget(klucz,2,0600|IPC_CREAT|IPC_EXCL);
if((semid==-1)&&(errno==EEXIST))semid=semget(klucz,2,0600);
w_powietrzu=Ar;
na_lotnisku=0;
semctl(semid,0,SETVAL,N);//ustaw pojemnosc lotniskowca
semctl(semid,1,SETVAL,1);//ustaw dostep do pasa
printf("nadlatuja samoloty\n");
for(i=0;i0);
semctl(semid,0,IPC_RMID,&buf);
exit(0);
}
Problem 5 filozofów , Lotnisko
- kadiii
- Użytkownik

- Posty: 638
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
Problem 5 filozofów , Lotnisko
To są dwa problemy synchronizacyjne. O tych filozowach to poczytaj np. tu ... zof%C3%B3w
Jak zrozumiesz problem to będziesz też rozumiał te dwa programy. W skrócie to chodzi o niemożność wykonania dwóch czynności w jednym czasie, pojawiające się w ten sposób kolizje i możliwość kordynacji tego układu jedynie poprzez dodanie elementu do układu np.arbitra lub jak w Twoim przypadku semaforów- , to ta struktura. Ale kod rzeczywiście nieczytelny, koszmar... pozdrawiam
Jak zrozumiesz problem to będziesz też rozumiał te dwa programy. W skrócie to chodzi o niemożność wykonania dwóch czynności w jednym czasie, pojawiające się w ten sposób kolizje i możliwość kordynacji tego układu jedynie poprzez dodanie elementu do układu np.arbitra lub jak w Twoim przypadku semaforów-
Kod: Zaznacz cały
static struct sembuf buf;
