2010-07-24 15 views
5

Ho il seguente codice C:C: funzione di segnale (parametri?)

void handler(int n) { 
    printf("n value: %i\n"); 
} 

int main() { 
    signal(SIGTSTP, handler); // ^Z at keyboard 
    for(int n = 0; ; n++) { 
    } 
} 

Sono curioso quello che il parametro n è la funzione del gestore. Quando si preme ^Z, in genere viene stampato: 8320, -1877932264 o -1073743664. Quali sono questi numeri?


Modifica: Ops ho scritto il mio printf sbagliato. L'ho corretto:

void handler(int n) { 
    printf("n value: %i\n",n); 
} 

Ora il valore di n è sempre: 18. Che cos'è questo 18?

risposta

8

Non hai passato alcun numero a printf(). Dovrebbe essere:

void handler(int n) { 
    printf("n value: %i \n", n); 
} 

Il n sarà il signum si stanno recuperando, nel tuo caso 20. Vedere man 2 signal per una descrizione. Si noti inoltre che la manpage consiglia di utilizzare sigaction() anziché signal.

-1

Sono stand-in per i demoni nasali.

+0

+1, un +1 in più se hai un grande naso –

6

Il modo in cui lo hai scritto, stampa spazzatura casuale. Il motivo è che non si passa n a printf. Dovrebbe essere

void handler(int n) { 
    printf("n value: %i \n", n); 
} 

In questo modo, stampa il numero del segnale.

6

Il parametro gestore di segnale è il numero di segnale , quindi è possibile utilizzare una funzione per molti segnali. Vedi signal(3).

2

Il singolo argomento per una funzione di gestione del segnale è il numero del segnale (non sorprendentemente). Da man signal:

No Name   Default Action  Description 
18 SIGTSTP  stop process   stop signal generated from keyboard (CTRL + Z usually) 
0

Restituisce il numero del segnale. Controlla questo link per ulteriori informazioni sui segnali di controllo del lavoro come quello che hai usato.

The SIGTSTP signal is an interactive stop signal. Unlike SIGSTOP, this signal 
can be handled and ignored. 
Your program should handle this signal if you have a special need 
to leave files or system tables in a secure state when a process is 
stopped. For example, programs that turn off echoing should handle 
SIGTSTP so they can turn echoing back on before stopping. 
Problemi correlati