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
|