Problem 5 filozofów , Lotnisko
: 28 cze 2007, o 11:07
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);
}
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);
}