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
oufread
).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, consultemalloc
.Não use nenhuma função que gere uma chamada de sistema (por exemplo,
_getcwd
outime
).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