2010-07-24 22 views
5

I tienen el siguiente código c:C: función de señal (parámetros?)

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

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

Tengo curiosidad lo que el parámetro n se encuentra en la función de controlador. Cuando presiona ^Z, generalmente imprime: 8320, -1877932264 o -1073743664. ¿Cuáles son estos números?


Editar: Operaciones escribí mi printf mal. Lo corrigí para ser:

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

Ahora el valor de n es siempre: 18. ¿Qué es esto 18?

Respuesta

8

No ha pasado ningún número a printf(). En caso de ser:

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

El n será el signum tienes que coger, en su caso 20. Ver man 2 signal para una descripción. También tenga en cuenta que la página de manual recomienda usar sigaction() en lugar de signal.

-1

Son suplentes para los demonios nasales.

+0

+1, un extra +1 si tiene una nariz grande –

6

La forma en que lo ha escrito, imprime basura al azar. La razón es que no pasa n a printf. Debe ser

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

De esta forma, se imprime el número de señal.

6

El parámetro del manejador de señal es número de señal, por lo que puede usar una función para muchas señales. Ver signal(3).

2

El único argumento para una función del manejador de señal es el número de señal (como era de esperar). De man signal:

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

Devuelve el número de señal. Consulte este link para obtener más información sobre señales de control de trabajos como la que ha utilizado.

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. 
Cuestiones relacionadas