lukson_82
17.02.05, 03:06
Witam.
Prosze o pomoc. Napisalem program ktorego zadaniem ma byc analiza szumow (licz
b generowanych w /dev/random i /dev/urandom). Ma to odbywac sie w 5 watkach z
czego pierwszy ma zczytywac dane z /dev/random drugi wpisywac do pliku
informacje i analizowac je(tak samo dla urandom), oraz watku kontrolujacego
prace tych 4 watkow(ustawianie przedzialu czasu z ktorego dame maja byc
analizowane itd). A problemy mam takie i porosze o pomoc w rozwiazaniu:
po pierwsze nie wiem za bardzo jak nadac wartosci poczatkowe semaforom(niby
jest sem_init() ale i tak cos nie dzialalo-moze nieumiejetnie nadawalem te
wartosci), po drugie jak to zrobic by wyswietlane byly na ekranie informacje
zarowno z random jaki i urandom(czyli watkow B,D), kolejna sprawa rowniez
zwiazana z semaforami(tak przypuszczam przynajmniej:)) czemu watki B i D
odrazu po uruchomieniu programu tworza pliki i zapisuja do nich zamiast czekac
na podanie okna czasowego (podejrzewam ze nie nadane wartosci poczatkowe
semaforom) i jak to zmienic zeby analiza rozpoczela sie dopiero po ustawieniu
okna? Z gory dziekuje za pomoc :) Pozdrawiam
A to kod:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
struct node
{
int iValue;
struct node *next;
};
struct node *rootA,*rootB;
struct node *currentA,*currentB;
int iTime=1;
int iMode=1;
int iWork=1;
sem_t sem_writeA;
sem_t sem_writeB;
sem_t sem_oknoA;
sem_t sem_oknoB;
struct node* write(struct node **n,int iWartosc)
{
if((*n)==NULL)
{
(*n)=(struct node *)malloc(sizeof(struct node));
if((*n)==NULL)
{
perror("Blad alokacji pamieci");
exit(-1);
}
else
{
(*n)->next=NULL;
(*n)->iValue=iWartosc;
return (*n);
}
}
else
{
return write(&(*n)->next,iWartosc);
}
}
void * thA_writer(void * arg)
{
FILE *random;
int i;
if((random=fopen("/dev/random","r"))==NULL)
{
perror("Blad otwarcia pliku");
exit(-1);
}
else
{
currentA=write(&rootA,fgetc(random));
while(iWork)
{
currentA=write(¤tA,fgetc(random));
sem_post(&sem_writeA);
}
fclose(random);
}
}
void * thB_reader(void * arg)
{
FILE *wynik;
struct node * tmp;
long int iCounter=0,iSum=0;
int okno=0,mode=0;
float fSrednia;
if((wynik=fopen("wynikiA.txt","w"))==NULL)
{
perror("Blad otwarcia pliku");
exit(-1);
}
while(iWork)
{
if(sem_trywait(&sem_oknoA)!=-1)
{
okno=iTime;
mode=iMode;
}
sleep(okno);
while((sem_trywait(&sem_writeA)!=-1))
{
iCounter++;
iSum=iSum+rootA->iValue;
fprintf(wynik,"%i|",rootA->iValue);
tmp=rootA;
rootA=rootA->next;
free(tmp);
}
if(iCounter)
{
fSrednia=(float)iSum/iCounter;
if(mode)
{
printf("Srednia z random: %0.2f \t|Liczba pomiarow: %i\n",fSrednia,iCounter);
}
iCounter=0;
iSum=0;
}
}
fclose(wynik);
}
void * thC_writer(void * arg)
{
FILE *urandom;
int i;
if((urandom=fopen("/dev/urandom","r"))==NULL)
{
perror("Blad otwarcia pliku");
exit(-1);
}
else
{
currentB=write(&rootB,fgetc(urandom));
while(iWork)
{
currentB=write(¤tB,fgetc(urandom));
sem_post(&sem_writeB);
}
fclose(urandom);
}
}
void * thD_reader(void * arg)
{
FILE *wynik;
struct node * tmp;
long int iCounter=0,iSum=0;
int okno=0,mode=0;
float fSrednia;
if((wynik=fopen("wynikiB.txt","w"))==NULL)
{
perror("Blad otwarcia pliku");
exit(-1);
}
while(iWork)
{
if(sem_trywait(&sem_oknoB)!=-1)
{
okno=iTime;
mode=iMode;
}
sleep(okno);
while((sem_trywait(&sem_writeB)!=-1))
{
iCounter++;
iSum=iSum+rootB->iValue;
fprintf(wynik,"%i|",rootB->iValue);
tmp=rootB;
rootB=rootB->next;
free(tmp);
}
if(iCounter)
{
fSrednia=(float)iSum/iCounter;
if(mode)
{
printf("Srednia z urandom: %0.2f \t|Liczba pomiarow: %i\n",fSrednia,iCounter);
}
iCounter=0;
iSum=0;
}
}
fclose(wynik);
}
void text()
{
printf("ANALIZATOR SZUMOW\n\n");
printf("Menu:\n");
printf("n\t Wprowadz nowe okno czasowe(autostart wyswietlania)\n");
printf("s\t Zatrzymaj wyswietlanie wynikow pomiarow\n");
printf("r\t Wznow wyswietlanie wynikow pomiarow\n");
printf("q\t Konczenie programu\n");
}
void * thE(void * arg)
{
int pom,exit=1;
char z;
text();
while(exit)
{
z=getchar();
switch(z)
{
case 'n':
iMode=0;
sem_post(&sem_oknoA);
sem_post(&sem_oknoB);
printf("\n\nWprowadz nowe okno czasowe:");
scanf("%i",&iTime);
iMode=1;
sem_post(&sem_oknoA);
sem_post(&sem_oknoB);
break;
case 'r':
iMode=1;
sem_post(&sem_oknoA);
sem_post(&sem_oknoB);
break;
case 's':
iMode=0;
sem_post(&sem_oknoA);
sem_post(&sem_oknoB);
break;
case 'q':
iWork=0;
iMode=0;
exit=0;
sem_post(&sem_oknoA);
sem_post(&sem_oknoB);
break;
default :
break;
}
}
}
main()
{
pthread_t th_A,th_B,th_C,th_D,th_E;
int iRetval;
if((pthread_create(&th_A,NULL,thA_writer,NULL))!=0)
{
printf("Nie udalo sie utworzyc watku.");
exit(-1);
}
if((pthread_create(&th_C,NULL,thC_writer,NULL))!=0)
{
printf("Nie udalo sie utworzyc watku.");
exit(-1);
}
if((pthread_create(&th_B,NULL,thB_reader,NULL))!=0)
{
printf("Nie udalo sie utworzyc watku.");
exit(-1);
}
if((pthread_create(&th_D,NULL,thD_reader,NULL))!=0)
{
printf("Nie udalo sie utworzyc watku.");
exit(-1);
}
if((pthread_create(&th_E,NULL,thE,NULL))!=0)
{
printf("Nie udalo sie utworzyc watku.");
exit(-1);
}
pthread_join(th_A,NULL);
pthread_join(th_B,NULL);
pthread_join(th_C,NULL);
pthread_join(th_D,NULL);
pthread_join(th_E,NULL);
return 0;
}