Compartilhar via


signal

Define a manipulação de sinal de interrupção.

Importante

Não use esse método para desligar um aplicativo da Microsoft Store, exceto em cenários de teste ou depuração. As formas programáticas ou de interface do usuário para fechar um aplicativo da Store não são permitidas de acordo com as políticas da Microsoft Store. Para obter mais informações, confira o Ciclo de vida do aplicativo UWP.

Sintaxe

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

Parâmetros

sig
Valor de sinal.

func
O segundo parâmetro é um ponteiro para a função a ser executada. O primeiro parâmetro é um valor de sinal e o segundo parâmetro é um subcódigo que pode ser usado quando o primeiro parâmetro é SIGFPE.

Valor retornado

signal retorna o valor anterior de func que é associado ao sinal informado. Por exemplo, se o valor anterior de func era SIG_IGN, o valor retornado também é SIG_IGN. Um valor retornado de SIG_ERR indica um erro; nesse caso, errno é definido como EINVAL.

Para obter mais informações sobre códigos de retorno, confira errno, _doserrno, _sys_errlist e _sys_nerr.

Comentários

A função signal permite que um processo escolha uma das várias maneiras de lidar com um sinal de interrupção do sistema operacional. O argumento sig é a interrupção à qual signal responde; ele deve ser uma das constantes do manifesto a seguir, que são definidas no SIGNAL.H.

sig valor Descrição
SIGABRT Encerramento anormal
SIGFPE Erro de ponto flutuante
SIGILL Instrução ilegal
SIGINT Sinal de CTRL+C
SIGSEGV Acesso ao armazenamento inválido
SIGTERM Solicitação de encerramento

Se sig não for um dos valores acima, o manipulador de parâmetro inválido será invocado, conforme definido em Validação de parâmetro. Se a execução puder continuar, essa função definirá errno para EINVAL e retornará SIG_ERR.

Por padrão, signal encerra o programa de chamada com o código de saída 3, independentemente do valor de sig.

Observação

Nenhum aplicativo Win32 dá suporte a SIGINT. Quando ocorre uma interrupção CTRL+C, sistemas operacionais Win32 geram um novo thread para manipular especificamente essa interrupção. Isso pode fazer com que um aplicativo de thread único, tal como um no UNIX, torne-se multithread e cause um comportamento inesperado.

O func argumento é um endereço para um manipulador de sinal que você escreve, ou para uma das constantes SIG_DFL de ação de sinal predefinidas ou SIG_IGN, que também são definidas em SIGNAL.H. Se func for uma função, ela será instalada como o manipulador de sinal para o sinal fornecido. O protótipo do manipulador de sinal requer um argumento formal, sig, do tipo int. O sistema operacional fornece o argumento real por meio de sig quando ocorre uma interrupção; o argumento é o sinal que gerou a interrupção. Portanto, você pode usar as seis constantes de manifesto (listadas na tabela anterior) no seu manipulador de sinal para determinar qual interrupção ocorreu e tomar ações adequadas. Por exemplo, você pode chamar signal duas vezes para atribuir o mesmo manipulador para dois sinais diferentes e, em seguida, testar o argumento sig no manipulador para executar ações diferentes com base no sinal recebido.

Se você estiver testando exceções de ponto flutuante (SIGFPE), func aponta para uma função que usa um segundo argumento opcional que é uma das várias constantes de manifesto, definidas em FLOAT.H, do formulário FPE_xxx. Quando ocorre um SIGFPE sinal, você pode testar o valor do segundo argumento para determinar o tipo de exceção de ponto flutuante e, em seguida, tomar as medidas apropriadas. Esse argumento e seus possíveis valores são extensões da Microsoft.

Para exceções de ponto flutuante, o valor de func não é redefinido quando o sinal é recebido. Para recuperar-se de exceções de ponto flutuante, use cláusulas try/except ao redor de operações de ponto flutuante. Também é possível recuperar-se usando setjmp com longjmp. Em ambos os casos, o processo de chamada continua a execução e deixa o estado de ponto flutuante do processo indefinido.

Se o manipulador de sinal retornar, o processo de chamada retomará a execução imediatamente após o ponto em que recebeu o sinal de interrupção, independentemente do tipo de sinal ou modo de operação.

Antes da função especificada ser executada, o valor de func é definido como SIG_DFL. O próximo sinal de interrupção é tratado como descrito para SIG_DFL, a menos que uma chamada intermediária para signal especifique o contrário. Você pode usar esse recurso para redefinir os sinais na função chamada.

Como as rotinas de manipulador de sinal geralmente são chamadas de forma assíncrona quando ocorre uma interrupção, sua função de manipulador de sinal pode obter controle quando uma operação de tempo de execução está incompleta e em um estado desconhecido. A lista a seguir resume as restrições que determinam quais funções você pode usar em sua rotina de manipulador de sinal.

  • Não emita rotinas de baixo nível ou STDIO.H de E/S (por exemplo, printf ou fread).

  • Não chame rotinas de heap ou qualquer rotina que use as rotinas de heap (por exemplo, malloc, _strdup, ou _putenv). Para obter mais informações, consulte malloc.

  • Não use nenhuma função que gere uma chamada de sistema (por exemplo, _getcwd ou time).

  • Não use longjmp a menos que a interrupção seja causada por uma exceção de ponto flutuante (ou seja, sig é SIGFPE). Nesse caso, reinicialize primeiro o pacote de ponto flutuante usando uma chamada para _fpreset.

  • Não use nenhuma rotina de sobreposição.

Um programa deve conter código de ponto flutuante se for para interceptar a SIGFPE exceção usando a função. Se o programa não tiver código de ponto flutuante e exigir o código de manipulação de sinal da biblioteca de tempo de execução, basta declarar um duplo volátil e inicializá-lo como zero:

volatile double d = 0.0f;

Os SIGILL sinais e SIGTERM não são gerados no Windows. Eles estão incluídos para compatibilidade ANSI. Portanto, você pode definir manipuladores de sinal para esses sinais usando signal e você também pode gerar esses sinais explicitamente, chamando raise.

As configurações de sinal não são preservadas em processos gerados criados por chamadas ou _exec _spawn funções. As configurações de sinal são redefinidas para os valores padrão no novo processo.

Requisitos

Rotina Cabeçalho necessário
signal <signal.h>

Para obter informações sobre compatibilidade, consulte Compatibilidade.

Exemplo

O exemplo a seguir mostra como usar signal para adicionar um comportamento personalizado para o sinal SIGABRT. Para obter mais informações sobre o comportamento de anulação, 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>

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();
}

A saída depende da versão do runtime usada, se o aplicativo é de console ou aplicativo do Windows e das configurações do Registro do Windows. Para um aplicativo de console, algo semelhante à seguinte mensagem pode ser enviado ao stderr:

Debug Error!

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

R6010

- abort() has been called

Confira também

Controle de processo e ambiente
abort
_exec, _wexec funções
exit, _Exit, _exit
_fpreset
_spawn, _wspawn funções