signalsignal

Determina el control de señales de interrupción.Sets interrupt signal handling.

Importante

No use este método para cerrar una aplicación Microsoft Store, excepto en escenarios de prueba o depuración.Do not use this method to shut down a Microsoft Store app, except in testing or debugging scenarios. No se permiten las formas de cerrar una aplicación de la tienda mediante programación o la interfaz de usuario de acuerdo con las directivas de Microsoft Store.Programmatic or UI ways to close a Store app are not permitted according to the Microsoft Store policies. Para obtener más información, consulte el ciclo de vida de las aplicaciones para UWP.For more information, see UWP app lifecycle.

SintaxisSyntax

void __cdecl *signal(int sig, int (*func)(int, int));

ParámetrosParameters

firmasig
Valor de la señal.Signal value.

funcfunc
El segundo parámetro es un puntero a la función que se va a ejecutar.The second parameter is a pointer to the function to be executed. 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.The first parameter is a signal value and the second parameter is a sub-code that can be used when the first parameter is SIGFPE.

Valor devueltoReturn Value

Signal devuelve el valor anterior de FUNC que está asociado a la señal determinada.signal returns the previous value of func that's associated with the given signal. Por ejemplo, si el valor anterior de FUNC se SIG_IGN, también se SIG_IGNel valor devuelto.For example, if the previous value of func was SIG_IGN, the return value is also SIG_IGN. Un valor devuelto de SIG_ERR indica un error; en ese caso, errno se establece en EINVAL.A return value of SIG_ERR indicates an error; in that case, errno is set to EINVAL.

Vea errno, _doserrno, _sys_errlist y _sys_nerr para obtener más información sobre los códigos de retorno.See errno, _doserrno, _sys_errlist, and _sys_nerr for more information about return codes.

ObservacionesRemarks

La función Signal permite que un proceso elija una de varias maneras de controlar una señal de interrupción desde el sistema operativo.The signal function enables a process to choose one of several ways to handle an interrupt signal from the operating system. El argumento SIG es la interrupción a la que responde la señal ; debe ser una de las constantes de manifiesto siguientes, que se definen en la señal. C.The sig argument is the interrupt to which signal responds; it must be one of the following manifest constants, which are defined in SIGNAL.H.

valor SIGsig value DescripciónDescription
SIGABRTSIGABRT Terminación anómalaAbnormal termination
SIGFPESIGFPE Error de punto flotanteFloating-point error
SIGILLSIGILL Instrucción no válidaIllegal instruction
SIGINTSIGINT Señal de CTRL+CCTRL+C signal
SIGSEGVSIGSEGV Acceso no válido a almacenamientoIllegal storage access
SIGTERMSIGTERM Solicitud de finalizaciónTermination request

Si SIG no es ninguno de los valores anteriores, se invoca el controlador de parámetros no válidos, tal y como se define en validación de parámetros .If sig is not one of the above values, the invalid parameter handler is invoked, as defined in Parameter Validation . Si la ejecución puede continuar, esta función establece errno en EINVAL y devuelve SIG_ERR.If execution is allowed to continue, this function sets errno to EINVAL and returns SIG_ERR.

De forma predeterminada, la señal finaliza el programa de llamada con el código de salida 3, independientemente del valor de SIG.By default, signal terminates the calling program with exit code 3, regardless of the value of sig.

Nota

SIGINT no es compatible con ninguna aplicación Win32.SIGINT is not supported for any Win32 application. 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.When a CTRL+C interrupt occurs, Win32 operating systems generate a new thread to specifically handle that interrupt. 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.This can cause a single-thread application, such as one in UNIX, to become multithreaded and cause unexpected behavior.

El argumento FUNC es una dirección de un controlador de señal que se escribe, o de una de las constantes predefinidas SIG_DFL o SIG_IGN, que también se definen en la señal. C.The func argument is an address to a signal handler that you write, or to one of the predefined constants SIG_DFL or SIG_IGN, which are also defined in SIGNAL.H. Si FUNC es una función, se instala como controlador de señal para la señal determinada.If func is a function, it is installed as the signal handler for the given signal. El prototipo del controlador de señal requiere un argumento formal, SIG, de tipo int .The signal handler's prototype requires one formal argument, sig, of type int. El sistema operativo proporciona el argumento real a través de SIG cuando se produce una interrupción. el argumento es la señal que generó la interrupción.The operating system provides the actual argument through sig when an interrupt occurs; the argument is the signal that generated the interrupt. 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.Therefore, you can use the six manifest constants (listed in the preceding table) in your signal handler to determine which interrupt occurred and take appropriate action. Por ejemplo, puede llamar a Signal dos veces para asignar el mismo controlador a dos señales diferentes y, a continuación, probar el argumento SIG en el controlador para realizar distintas acciones en función de la señal recibida.For example, you can call signal twice to assign the same handler to two different signals, and then test the sig argument in the handler to take different actions based on the signal received.

Si está probando las 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.If you are testing for floating-point exceptions (SIGFPE), func points to a function that takes an optional second argument that is one of several manifest constants, defined in FLOAT.H, of the form FPE_xxx. Cuando se produce una señal SIGFPE , puede probar el valor del segundo argumento para determinar el tipo de excepción de punto flotante y, a continuación, tomar las medidas adecuadas.When a SIGFPE signal occurs, you can test the value of the second argument to determine the kind of floating-point exception and then take appropriate action. Este argumento y sus valores posibles son extensiones de Microsoft.This argument and its possible values are Microsoft extensions.

En el caso de las excepciones de punto flotante, el valor de FUNC no se restablece cuando se recibe la señal.For floating-point exceptions, the value of func is not reset when the signal is received. Para recuperarse de excepciones de punto flotante, utilice cláusulas Try o Except para rodear las operaciones de punto flotante.To recover from floating-point exceptions, use try/except clauses to surround the floating point operations. También se puede recuperar usando setjmp con longjmp.It's also possible to recover by using setjmp with longjmp. En cualquier caso, el proceso de llamada reanuda la ejecución y deja el estado de punto flotante del proceso sin definir.In either case, the calling process resumes execution and leaves the floating-point state of the process undefined.

Si vuelve el controlador de señal, el proceso de llamada reanuda la ejecución inmediatamente después del punto en el que recibió la señal de interrupción.If the signal handler returns, the calling process resumes execution immediately following the point at which it received the interrupt signal. Es así independientemente de la clase de señal o del modo de funcionamiento.This is true regardless of the kind of signal or operating mode.

Antes de que se ejecute la función especificada, el valor de FUNC se establece en SIG_DFL.Before the specified function is executed, the value of func is set to 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 lo contrario.The next interrupt signal is treated as described for SIG_DFL, unless an intervening call to signal specifies otherwise. Puede usar esta característica para restablecer señalas en la función a la que se llama.You can use this feature to reset signals in the called function.

Dado que se suele llamar a las rutinas de controlador de señal de forma asincrónica cuando se produce una interrupción, la función del controlador de señal puede hacerse con el control cuando una operación de tiempo de ejecución no está completa y está en un estado desconocido.Because signal-handler routines are usually called asynchronously when an interrupt occurs, your signal-handler function may get control when a run-time operation is incomplete and in an unknown state. En la lista siguiente se resumen las restricciones que determinan qué funciones se pueden usar en la rutina del controlador de señal.The following list summarizes the restrictions that determine which functions you can use in your signal-handler routine.

  • No emita bajo nivel ni STDIO. Las rutinas de e/s de H (por ejemplo, printf o fread).Do not issue low-level or STDIO.H I/O routines (for example, printf or fread).

  • No llame a rutinas del montón ni a ninguna rutina que use las rutinas del montón (por ejemplo, malloc, _strdupo _putenv).Do not call heap routines or any routine that uses the heap routines (for example, malloc, _strdup, or _putenv). Vea malloc para obtener más información.See malloc for more information.

  • No use ninguna función que genere una llamada del sistema (por ejemplo, _getcwd o Time).Do not use any function that generates a system call (for example, _getcwd or time).

  • No utilice longjmp a menos que la interrupción se deba a una excepción de punto flotante (es decir, que SIG sea SIGFPE).Do not use longjmp unless the interrupt is caused by a floating-point exception (that is, sig is SIGFPE). En este caso, reinicialice primero el paquete de punto flotante mediante una llamada a _fpreset.In this case, first reinitialize the floating-point package by using a call to _fpreset.

  • No use ninguna rutina superpuesta.Do not use any overlay routines.

Un programa debe contener código de punto flotante si se va a capturar la excepción SIGFPE mediante la función.A program must contain floating-point code if it is to trap the SIGFPE exception by using the function. Si el programa no tiene código de punto flotante y requiere el código de control de señal de la biblioteca en tiempo de ejecución, simplemente declare un doble volátil e inicialícelo en cero:If your program does not have floating-point code and requires the run-time library's signal-handling code, just declare a volatile double and initialize it to zero:

volatile double d = 0.0f;

Las señales SIGILL y SIGTERM no se generan en Windows.The SIGILL and SIGTERM signals are not generated under Windows. Se incluyen para razones de compatibilidad con ANSI.They are included for ANSI compatibility. Por lo tanto, puede establecer controladores de señal para estas señales mediante Signal, y también puede generar estas señales explícitamente llamando a raise.Therefore, you can set signal handlers for these signals by using signal, and you can also explicitly generate these signals by calling raise.

La configuración de la señal no se conserva en los procesos generados que se crean mediante llamadas a funciones de _exec o _spawn .Signal settings are not preserved in spawned processes that are created by calls to _exec or _spawn functions. Las configuraciones de las señales se restablecen a los valores predeterminados en el proceso nuevo.The signal settings are reset to the default values in the new process.

RequisitosRequirements

RutinaRoutine Encabezado necesarioRequired header
signalsignal <signal.h>

Para obtener información adicional sobre compatibilidad, consulte Compatibilidad.For additional compatibility information, see Compatibility.

EjemploExample

En el ejemplo siguiente se muestra cómo usar Signal para agregar algún comportamiento personalizado a la señal SIGABRT .The following example shows how to use signal to add some custom behavior to the SIGABRT signal. Para obtener más información sobre el comportamiento de anulación, vea _set_abort_behavior.For additional information about abort behavior, see _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 tiempo de ejecución que se use, si la aplicación es una consola de o una aplicación de Windows, y en la configuración del registro de Windows.The output depends on the version of the runtime used, whether the app is a console or Windows app, and on Windows registry settings. En el caso de una aplicación de consola, es posible que se envíe algo parecido al siguiente mensaje a stderr:For a console app, something like the following message may be sent to stderr:

Debug Error!

Program: c:\Projects\crt_signal\Debug\crt_signal.exe

R6010

- abort() has been called

Consulte tambiénSee also

Control de proceso y entornoProcess and Environment Control
anularabort
_exec, _wexec funciones_exec, _wexec Functions
exit, _Exit, _exitexit, _Exit, _exit
_fpreset_fpreset
_spawn, _wspawn funciones_spawn, _wspawn Functions