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 constantesSIG_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 o fread).

  • No llame a rutinas de montón ni a ninguna rutina que use las rutinas del montón (por ejemplo, malloc, _strdupo _putenv). Para obtener más información, vea malloc.

  • No use ninguna función que genere una llamada al sistema (por ejemplo, _getcwd o time).

  • No use longjmp a menos que la interrupción se deba a una excepción de punto flotante (es decir, sig es SIGFPE). 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