[C, sygnaly] problem z sitem erastotenesa (sygnalami)

0

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?

0

stdout jest buforowany, stderr nie.
Więc dane dopisane do stderr mogą pojawić się na ekranie wcześniej niż dane dopisane do stdout (bo one poczekają sobie aż będzie można zrzucić cały bufor)

0

jakies pomysly jak mozna to ominac?

0

może fflush(sdtout) po każdym zapisie do stdout ?

0

dzieki wielkie!! wyglada na to ze fflush() zalatwia sprawe ! :) jeszcze raz wielkie dzieki!

0

to zarżnie strumienie i spowolni prace. proponowalbym raczej:

...
                        printf("%i ",i);  //zostawic
...
        }
        fflush(stdout); //zamiast setki wywolan, wystarczy jedno, tuz przed fprint/err
        if(czy_liczyc)fprintf(stderr,"Wyznaczono wszystkie liczby pierwsze!\n");
        else fprintf(stderr,"STOP! Przerwano przez uzytkownika\n");
        exit(0);

1 użytkowników online, w tym zalogowanych: 0, gości: 1