signal

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Determina el control de señales de interrupción.

System_CAPS_ICON_important.jpg Importante

No use este método para cerrar una aplicación de Tienda Windows 8.x, salvo en escenarios de prueba o depuración. Formas mediante programación o la interfaz de usuario para cerrar un Tienda Windows 8.x aplicación no se permiten según la sección 3.6 de los requisitos de certificación de aplicaciones de Windows 8. Para obtener más información, consulte ciclo de vida de aplicaciones (aplicaciones de Windows Store).

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

Parámetros

sig
Valor de la señal.

func
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.

signal devuelve el valor anterior de func asociado a la señal determinada. 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.

Consulte errno, _doserrno, _sys_errlist y _sys_nerr para obtener más información acerca de los códigos de retorno.

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 de 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 sigDescripción
SIGABRTTerminación anómala
SIGFPEError de punto flotante
SIGILLInstrucción no válida
SIGINTSeñal de CTRL+C
SIGSEGVAcceso no válido a almacenamiento
SIGTERMSolicitud de finalización

Si sig no es uno de los valores anteriores, se invoca el controlador de parámetros no válidos, como se define en validación del parámetro . 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.

System_CAPS_ICON_note.jpg 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 argumento de 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 SIGNAL.H. Si func es una función, se instala como controlador de señal para la señal determinada. 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 desea comprobar las excepciones de punto flotante (SIGFPE), func señala 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 señal SIGFPE, puede probar el valor del segundo argumento para determinar el tipo de excepción de punto flotante y, a continuación, realizar la acción adecuada. Este argumento y sus valores posibles son extensiones de Microsoft.

En el caso de 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 es posible recuperar mediante 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 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. Es así independientemente de la clase de señal o del 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 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. 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 de bajo nivel o de STDIO.H (por ejemplo, printf o fread).

  • No llame a rutinas del montón ni a ninguna rutina que use rutinas del montón (por ejemplo, malloc, _strdup o _putenv). Consulte malloc para obtener más información.

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

  • No use longjmp a menos que la interrupción sea consecuencia de 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 superpuesta.

Un programa debe contener código de punto flotante para interceptar la excepción de SIGFPE mediante la función. 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:

volatile double d = 0.0f;   

Las señales de SIGILL y SIGTERM no se generan en Windows. Se incluyen para razones de compatibilidad con ANSI. Por lo tanto, puede establecer controladores de señal para estas señales mediante signal, y puede generar estas señales explícitamente llamando a generar.

Las configuraciones de las señales no se conservan en los procesos de generación creados mediante llamadas a las funciones _exec o _spawn. Las configuraciones de las señales se restablecen a los valores predeterminados en el proceso nuevo.

RutinaEncabezado necesario
signal<signal.h>

Para obtener más información sobre compatibilidad, vea Compatibilidad.

En el ejemplo siguiente se muestra cómo usar signal para agregar comportamiento personalizado a la señal SIGABRT. Para obtener información adicional acerca del comportamiento de anulación, consulte _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>  
#include <tchar.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();  
}  

This application has requested the Runtime to terminate it in an unusual way.  
Please contact the application's support team for more information.  
  

No es aplicable. Para llamar a la función estándar de C, use PInvoke. Para obtener más información, vea Ejemplos de invocación de plataforma.

Control de proceso y entorno
anular
_exec, _wexec (funciones)
salir, _Exit, _exit
_fpreset
_spawn, _wspawn (funciones)

Mostrar: