|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Sep 2005
Messaggi: 157
|
[ C ] info cattura segnali
ciao, non mi è molto chiaro un aspetto sulla gestione dei segnali..
mi potete dare una mano!? usando un costrutto del genere posso catturare un segnale e eseguire una funzione di "gestione" del segnale che ho catturato.. #include <signal.h> ... void gestoreKill() { //eseguita quando viene ricevuto un kill signal(SIGKILL, gestoreKill); ... } ... int main() { //Inizializza l'azione assegnata al segnale SIGKILL signal(SIGKILL, gestoreKill); ... } però non ho dove devo andare per trovare il codice esatto dell'errore.. questi: 249 /* codes for SIGSEGV */ 250 #define SEGV_MAPERR 1 /* Address not mapped to object. */ 251 #define SEGV_ACCERR 2 /* Invalid permissions for mapped */ 252 /* object. */ 253 254 /* codes for SIGFPE */ 255 #define FPE_INTOVF 1 /* Integer overflow. */ 256 #define FPE_INTDIV 2 /* Integer divide by zero. */ 257 #define FPE_FLTDIV 3 /* Floating point divide by zero. */ 258 #define FPE_FLTOVF 4 /* Floating point overflow. */ 259 #define FPE_FLTUND 5 /* Floating point underflow. */ 260 #define FPE_FLTRES 6 /* Floating point inexact result. */ 261 #define FPE_FLTINV 7 /* Invalid floating point operation. */ 262 #define FPE_FLTSUB 8 /* Subscript out of range. */ 263 264 /* codes for SIGTRAP */ 265 #define TRAP_BRKPT 1 /* Process breakpoint. */ 266 #define TRAP_TRACE 2 /* Process trace trap. se io catturo SIGTRAP come faccio a capire se è TRAP_BRKPT o TRAP_TRACE?! |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Forse vuoi dare una occhiata alla più completa "sigaction".
nb SIGKILL non è intercettabile.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Sep 2005
Messaggi: 157
|
vado a dare un occhiata alla sigaction....
---- quello che mi interessa fare è ad esempio questo... signal(SIGFPE, gestore); come faccio a capire quale caso si è verificato fra questi!? 254 /* codes for SIGFPE */ 255 #define FPE_INTOVF 1 /* Integer overflow. */ 256 #define FPE_INTDIV 2 /* Integer divide by zero. */ 257 #define FPE_FLTDIV 3 /* Floating point divide by zero. */ 258 #define FPE_FLTOVF 4 /* Floating point overflow. */ 259 #define FPE_FLTUND 5 /* Floating point underflow. */ 260 #define FPE_FLTRES 6 /* Floating point inexact result. */ 261 #define FPE_FLTINV 7 /* Invalid floating point operation. */ 262 #define FPE_FLTSUB 8 /* Subscript out of range. */ ps per la sigkill non ci avevo fatto caso.. avevo fatto un copia incolla... |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Non puoi. "signal" offre una interfaccia molto semplice. sigaction ti consente di registrare un handler cui vengono passati anche altri parametri, tra cui un siginfo_t che contiene varie informazioni (tra cui probabilmente quella che cerchi). L'utilizzo è semplice:
Codice:
void sighandler(int sig, siginfo_t *siginfo, void *data) { // il tuo signal handler } int main() { struct sigaction act; act.sa_flags = SA_SIGINFO; act.sa_sigaction = sighandler; sigemptyset(&act.sa_mask); sigaction(SIGSEGV, &act, NULL); ... }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:10.