Dodaj do ulubionych

Programowanie systemowe (Linux)

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;
}
Obserwuj wątek

Nie masz jeszcze konta? Zarejestruj się


Nakarm Pajacyka