witam! mam na uczelni do napisania programik w czystym C, ktory ma za zadanie tworzyc nowy proces liczacy i wyswietlajacy kolejne liczby pierwsze metoda sita erastotenesa w zakresie od 0 do 1000000. proces macierzysty ma czekac na wcisniecie klawisza, i jesli owe wcisniecie nastapi, ma przerwac proces potomny. Proces potomny (liczacy) ma przed swoim zakonczeniem powiadomic na standardowym wyjsciu bledu o powodzie zakonczenie - czy doliczyl do konca, czy zostal przerwany przez wcisniecie klawisza.
Moj problem polega na tym, ze napisany przeze mnie program dziala w przypadku gdy wciskam klawisz (ENTER) doskonale. Jednaklze w przypadku gdy nie wciskam klawisza sprawa wyglada tak ze liczy, liczy, liczy, i przy samym koncu nagle sie zatrzymuje (nawet ostatnio wyznaczona liczbe ucina) i wyswietla informacje na wyjsciu bledu ze juz skonczyl liczenie, i dopiero wtedy wyrzuca na ekran pozostale liczby, np :
996253 996267 99626Wyznaczono wszystkie liczby pierwsze!
99...
Co rowniez ciekawe, jak zadam mu zakres 10 to od razu wyswietli "Wyznaczono wszystkie liczby pierwsze!", a dopiero potem 2 3 5 7 ....
Ponizej zamieszczam kod. Mam nadzieje ze komus z Was bedzie sie chcialo przeczytac caly moj post i sproboje mi pomoc :D pozdrawiam i czekam na odzew!
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
const n=10000000;
int *tablica;
int czy_liczyc=1;
void sito(int *p, long n){
long i,j;
for(i=2;i<=n;i++){
if(p[i]==1){
printf("%i ",i);
for(j=i+i;j<=n;j+=i)p[j]=0;
}
if(czy_liczyc==0)break;
}
if(czy_liczyc)fprintf(stderr,"Wyznaczono wszystkie liczby pierwsze!\n");
else fprintf(stderr,"STOP! Przerwano przez uzytkownika\n");
free(p);
exit(0);
}
void potomek(int sig){
if (sig==SIGUSR1)czy_liczyc=0;
}
void wait(pid_t pid){
getchar();
kill(pid,SIGUSR1);
}
int main(){
tablica = (int *)malloc((n+1)*sizeof(int));
czy_liczyc=1;
long i;
for(i=0;i<=n;i++)tablica[i]=1;
pid_t pid;
signal(SIGUSR1,potomek);
pid=fork();
if(pid==0){
sito(tablica,n);
pause();
}
else wait(pid);
return 0;
}
PS - dodam jeszcze, ze gdy zamienilem fprintf'y na zwykle printf'y to dziala tak jak powinno...moze tu cos jest nie tak? nieprawidlowo wypisuje na wyjscie bledu?