signal
Determina el control de señales de interrupción.
Importante
No use este método para apagar una aplicación de Microsoft Store, salvo en escenarios de prueba o depuración. Las formas de cerrar una aplicación de Store mediante programación o con la interfaz de usuario no están permitidas según las Directivas de Microsoft Store. Para obtener más información, consulte Ciclo de vida de la aplicación para UWP.
Sintaxis
void __cdecl *signal(int sig, int (*func)(int, int));
Parámetros
sig
Valor de la señal.
func
El segundo parámetro es un puntero a la función que se va a ejecutar. El primer parámetro es un valor de señal y el segundo es un subcódigo que se puede usar cuando el primer parámetro es SIGFPE
.
Valor devuelto
signal
devuelve el valor anterior de la función asociada a la señal dada. Por ejemplo, si el valor anterior de func
era SIG_IGN
, el valor devuelto también es SIG_IGN
. Un valor devuelto de SIG_ERR
indica un error; en ese caso, errno
se establece en EINVAL
.
Para obtener más información sobre los códigos de retorno, vea errno
, _doserrno
, _sys_errlist
y _sys_nerr
.
Comentarios
La función signal
permite que un proceso elija una de las maneras de controlar una señal de interrupción del sistema operativo. El argumento sig
es la interrupción a la que responde signal
. Debe ser una de las constantes de manifiesto siguientes, que se definen en SIGNAL.H
.
Valor de sig |
Descripción |
---|---|
SIGABRT |
Terminación anómala |
SIGFPE |
Error de punto flotante |
SIGILL |
Instrucción no válida |
SIGINT |
Señal de CTRL+C |
SIGSEGV |
Acceso no válido a almacenamiento |
SIGTERM |
Solicitud de finalización |
Si sig
no es uno de los valores anteriores, se invoca al controlador de parámetros no válidos, tal como se define en Validación de parámetros . Si la ejecución puede continuar, la función establece errno
en EINVAL
y devuelve SIG_ERR
.
De forma predeterminada, signal
finaliza el programa de llamada con el código de salida 3, independientemente del valor de sig
.
Nota:
SIGINT
no se admite en ninguna aplicación Win32. Cuando se produce una interrupción de CTRL+C, los sistemas operativos de Win32 generan un subproceso nuevo para controlar esa interrupción específicamente. Así se puede hacer que una aplicación de un único subproceso, por ejemplo una de UNIX, se convierta en aplicación multiproceso y provoque un comportamiento inesperado.
El func
argumento es una dirección a un controlador de señal que escribe o en una de las constantes SIG_DFL
de acción de señal predefinidas o SIG_IGN
, que también se definen en SIGNAL.H. Si func
es una función, se instala como controlador de señal para la señal especificada. El prototipo del controlador de señal requiere un argumento formal, sig
, de int
. El sistema operativo proporciona el argumento real mediante sig
si se produce una interrupción. El argumento es la señal que generó la interrupción. Por consiguiente, puede usar las seis constantes de manifiesto de la tabla anterior en el controlador de señal para determinar qué interrupción se produjo y tomar las medidas adecuadas. Por ejemplo, puede llamar a signal
dos veces para asignar el mismo controlador a dos señales distintas, y después probar el argumento de sig
del controlador para realizar acciones distintas en función de la señal recibida.
Si está probando excepciones de punto flotante (SIGFPE
), func
apunta a una función que toma un segundo argumento opcional que es una de varias constantes de manifiesto, definidas en FLOAT.H
, con el formato FPE_xxx
. Cuando se produce una SIGFPE
señal, puede probar el valor del segundo argumento para determinar el tipo de excepción de punto flotante y, a continuación, realizar las acciones adecuadas. Este argumento y sus valores posibles son extensiones de Microsoft.
En el caso de las excepciones de punto flotante, el valor de func
no se restablece cuando se recibe la señal. Para recuperarse de excepciones de punto flotante, utilice cláusulas Try o Except para rodear las operaciones de punto flotante. También se puede recuperar usando setjmp
con longjmp
. En cualquier caso, el proceso de llamada reanuda la ejecución y deja el estado de punto flotante del proceso sin definir.
Si el controlador de señal devuelve, el proceso de llamada reanuda la ejecución inmediatamente después del punto en el que recibió la señal de interrupción, independientemente del tipo de señal o modo de funcionamiento.
Antes de que se ejecute la función especificada, el valor de func
se establece en SIG_DFL
. La siguiente señal de interrupción se trata como se describe en SIG_DFL
, a menos que una llamada intermedia a signal
especifique otra cosa. Puede usar esta característica para restablecer señalas en la función a la que se llama.
Dado que las rutinas del controlador de señales a menudo se llaman de forma asincrónica cuando se produce una interrupción, la función del controlador de señales puede obtener el control cuando una operación en tiempo de ejecución está incompleta y en un estado desconocido. En la lista siguiente se resumen las restricciones que determinan qué funciones se pueden usar en la rutina del controlador de señal.
No emita rutinas de E/S o
STDIO.H
de bajo nivel (por ejemplo,printf
ofread
).No llame a rutinas de montón ni a ninguna rutina que use las rutinas del montón (por ejemplo,
malloc
,_strdup
o_putenv
). Para obtener más información, veamalloc
.No use ninguna función que genere una llamada al sistema (por ejemplo,
_getcwd
otime
).No use
longjmp
a menos que la interrupción se deba a una excepción de punto flotante (es decir,sig
esSIGFPE
). En ese caso, reinicialice primero el paquete de punto flotante mediante una llamada a_fpreset
.No use ninguna rutina de superposición.
Un programa debe contener código de punto flotante si se va a interceptar la SIGFPE
excepción mediante la función . Si el programa no tiene código de punto flotante y requiere el código de control de señales de la biblioteca en tiempo de ejecución, solo tiene que declarar un doble volátil e inicializarlo en cero:
volatile double d = 0.0f;
Las SIGILL
señales y SIGTERM
no se generan en Windows. Se incluyen para la compatibilidad con ANSI. Por consiguiente, puede establecer controladores de señal para estas señales mediante signal
. También puede generar estas señales explícitamente llamando a raise
.
La configuración de señal no se conserva en los procesos generados creados por llamadas a _exec
funciones o _spawn
. Las configuraciones de las señales se restablecen a los valores predeterminados en el proceso nuevo.
Requisitos
Routine | Encabezado necesario |
---|---|
signal |
<signal.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
En el ejemplo siguiente se muestra cómo usar signal
para agregar comportamiento personalizado a la señal SIGABRT
. Para obtener más información sobre el comportamiento de anulación, vea _set_abort_behavior
.
// crt_signal.c
// compile with: /EHsc /W4
// Use signal to attach a signal handler to the abort routine
#include <stdlib.h>
#include <signal.h>
void SignalHandler(int signal)
{
if (signal == SIGABRT) {
// abort signal handler code
} else {
// ...
}
}
int main()
{
typedef void (*SignalHandlerPointer)(int);
SignalHandlerPointer previousHandler;
previousHandler = signal(SIGABRT, SignalHandler);
abort();
}
La salida depende de la versión del entorno de ejecución usado, tanto si la aplicación es una consola como una aplicación de Windows, y de la configuración del Registro de Windows. En el caso de una aplicación de consola, se puede enviar un mensaje similar al siguiente a stderr:
Debug Error!
Program: c:\Projects\crt_signal\Debug\crt_signal.exe
R6010
- abort() has been called
Consulte también
Control de procesos y entornos
abort
Funciones _exec
, _wexec
exit
, , _Exit
, _exit
_fpreset
Funciones _spawn
, _wspawn