Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Signal da numero di segnale a stringa corrispondente

0 views
Skip to first unread message

tyranitar

unread,
Dec 18, 2009, 7:59:24 PM12/18/09
to
Ciao,
stavo risolvendo e spiegando ad un mio amico come deve fare un
esercizio di programmazione C sui segnali.
L'esercizio in questione è molto semplice, è il tipo esercizio "fai un
processo che all'arrivo del segnale SIGXXX scrive su stdout
qualcosa...".

Per rendegli la vita più facile gli ho mostrato degli esempi e in
particolare volevo fare un programma che ridefinisce tutti i gestori
di segnali (tranne quelli non ridefinibili) su una funzione
"sig_handler", questa funzione sig_handler non deve fare altro che
dire "Sono il programma <PID> e mi è arrivato questo segnale:
<signum>".

Anche questo è molto facile, ma se io volessi stampare il nome del
segnale (per es. SIGUSR1) invece che il numero corrispondente?

Con uno switch funziona tutto:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

void handle_signal(int signum) {
signal(signum, handle_signal);

switch (signum) {
case SIGHUP:
fprintf(stderr, "SIGHUP\n");
break;
case SIGQUIT:
fprintf(stderr, "SIGQUIT\n");
break;
/* non li scrivo tutti */
case SIGUSR1:
fprintf(stderr, "SIGUSR1\n");
break;
}
}

int main() {
signal(SIGHUP, handle_signal);
signal(SIGQUIT, handle_signal);
signal(SIGUSR1, handle_signal);
while (1) {sleep(5);}
return 0;
}


Ma il problema è che non è particolarmente bello fare un case per ogni
segnale anche in termini di riusabilità...

Mi chiedevo se c'era un modo per risalire a SIGXXX dato il numero
corrispondente.

Grazie

Message has been deleted

Manuel B.

unread,
Dec 19, 2009, 6:29:50 AM12/19/09
to
>
> Se i segnali sono mappati su numeri che partono da 0 o 1 e sono
> consecutivi (come immagino che sia), puoi fare un array di stringhe:
>
> ad esempio se SIG00 fosse 0, SIG01 fosse 1, e SIG02 fosse 2:
> char pippo[2][10] = {"SIG00", "SIG01", "SIG02"};
>
> Cosi basta fare:
>
> fprintf (stderr, "%s\n", pippo[NUMERODELSEGNALE]);
>
> e sei a posto.

Non � pi� bello fare un enum di char ?

--

M.B.

Lorenzo Beretta

unread,
Dec 19, 2009, 1:17:20 PM12/19/09
to
Tetsuya wrote:

> tyranitar wrote:
>> Ciao,
>> stavo risolvendo e spiegando ad un mio amico come deve fare un
>> esercizio di programmazione C sui segnali.
>> L'esercizio in questione � molto semplice, � il tipo esercizio "fai un

>> processo che all'arrivo del segnale SIGXXX scrive su stdout
>> qualcosa...".
>>
>> Per rendegli la vita pi� facile gli ho mostrato degli esempi e in

>> particolare volevo fare un programma che ridefinisce tutti i gestori
>> di segnali (tranne quelli non ridefinibili) su una funzione
>> "sig_handler", questa funzione sig_handler non deve fare altro che
>> dire "Sono il programma <PID> e mi � arrivato questo segnale:
>> <signum>".
>>
>> Anche questo � molto facile, ma se io volessi stampare il nome del
>> Ma il problema � che non � particolarmente bello fare un case per ogni
>> segnale anche in termini di riusabilit�...

>>
>> Mi chiedevo se c'era un modo per risalire a SIGXXX dato il numero
>> corrispondente.
>>
>> Grazie
>
> Se i segnali sono mappati su numeri che partono da 0 o 1 e sono
> consecutivi (come immagino che sia), puoi fare un array di stringhe:
>
> ad esempio se SIG00 fosse 0, SIG01 fosse 1, e SIG02 fosse 2:
> char pippo[2][10] = {"SIG00", "SIG01", "SIG02"};
>
> Cosi basta fare:
>
> fprintf (stderr, "%s\n", pippo[NUMERODELSEGNALE]);
>
> e sei a posto.

Premesso che in generale la soluzione di tetsuya � di gran lunga la pi�
comoda, nel caso specifico esiste strsignal() in string.h

La manpage di linux dice che � posix 2008, ma anche presente su solaris
e bsd, per cui credo che la disponibilit� non sia un problema - e al
massimo, la si scrive...

Andrea Laforgia

unread,
Dec 20, 2009, 7:50:44 AM12/20/09
to
Tetsuya ha scritto:

> Se i segnali sono mappati su numeri che partono da 0 o 1 e sono
> consecutivi (come immagino che sia), puoi fare un array di stringhe:

[...]

Io sconsiglio vivamente di usare la tua soluzione. Quelle costanti sono
definite tali proprio per non fare affidamento su dei literal che
potrebbero cambiare nel tempo (nessuno vieta agli implementatori di
rinumerare le costanti). Per quanto meno elegante possa sembrare, � di
gran lunga meglio lo switch.

--

questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ab...@newsland.it


0 new messages