linux user group brescia

immagine del castello

Archivio della mailing list

Troppo ottimizzato!

Vernia Damiano melkor.x a tiscali.it
Lun 19 Maggio 2003 16:17:34 UTC
	Ciao, qualcuno ha un'idea per uscire ad questa buffa situazione? 
Ecco un programmino di prova che ho scritto:

#include <stdio.h>
#include <signal.h>

int var;

void gestsig(int segnale);

int main()
{
	struct sigaction	seg;

	var = 1;
//	seg.sa_mask = 0;
	seg.sa_flags = 0;
	seg.sa_handler = &gestsig;
	sigaction(SIGTERM, &seg, NULL);
	while (var);
	printf("\nvar e' zero !\n");
	return 0;
}

void gestsig(int segnale)
{
	printf("\nInterno del gestore di segnale per sig = %d\n", segnale);
	printf("var = %d\n", var);
	var = 0;
	printf("var = %d\n", var);
	printf("Uscita dal gestore di segnale\n");
}

	A vederlo e' la cosa piu' stupida del mondo. Ora, se lo compilo 
senza ottimizzazione (-O) fa quello che deve fare, cioe' mettersi li' a 
consumare cicli di CPU ed aspettare un SIGTERM. Quando questo arriva (con 
un normale kill) stampa quello che ci si aspetta ed esce.
	Se io invece ottimizzo (-O3, sarebbe il caso di usarlo poi nel 
progamma vero) anche dopo il kill non esce (e non fa la printf della main 
ma solo quelle in gestsig).
	Posso capire che lui veda un "var" che non puo' cambiare e lo 
sostituisca con un 1 nel ciclo while, ma io devo proprio fare questa cosa, 
salvo il fatto che nel ciclo while ci saranno funzioni che fanno davvero 
qualcosa, anche se non toccano assolutamente var.
	Come faccio a "rinstupidire" il compilatore tenendomi il -O3? 
Oppure a non rinstupidire il gcc ma fare quello che fa questo programma in 
modo pulito ma usando -O3?

	Domanda 2: ho guardato nei file <signal.h> e <bits/sigset.h> ma 
non ci ho trovato un modo pulito per dirgli che non voglio bloccare alcun 
segnale oltre a quello in "esecuzione". Come cribbio la inizializzo 'ste 
maledetta seg.sa_mask?

-- 
						Ciriciao
					LtC. Melkor?! B. Xapatan

PS: gcc versione 2.96 della RH 7.1 (o 7.3 a seconda del PC)




Maggiori informazioni sulla lista Lug