sinal
Tratamento de sinal de interrupção de conjuntos.
Importante |
---|
Não use este método para fechar um aplicativo de Windows Store , exceto em cenários testes ou de depuração.As maneiras programação ou de interface de usuário de fechar um aplicativo de Windows Store não são permitidas de acordo com a seção 3,6 Requisitos de certificação de aplicativo do Windows 8do.Para obter mais informações, consulte Ciclo de vida do aplicativo (aplicativos da Windows Store). |
void (__cdecl *signal( int sig, void (__cdecl *func ) (int [, int ] ))) (int);
Parâmetros
sig
Sinalize o valor.func
Função a ser executada.O primeiro parâmetro é um valor de sinal e o segundo parâmetro é um subelemento código que pode ser usado quando o primeiro parâmetro é SIGFPE.
Valor de retorno
signal retorna o valor anterior de func associada com o sinal dado.Por exemplo, se o valor anterior de func foi SIG_IGN, o valor de retorno é também SIG_IGN.Um valor de retorno de SIG_ERR indica um erro, nesse caso errno é definido como EINVAL.
Consulte _doserrno, errno, _sys_errlist, e _sys_nerr para obter mais informações sobre este, e outros códigos de retorno.
Comentários
A função de signal permite que um processo escolha uma das várias maneiras de manipular um sinal de interrupção do sistema operacional.O argumento é a sig de interrupção que responde a signal ; deve ser uma das seguintes constantes de manifesto, definido em. SIGNAL.H.
valor desig |
Descrição |
---|---|
SIGABRT |
Encerramento anormal |
SIGFPE |
Erro de ponto flutuante |
SIGILL |
Instrução ilegal |
SIGINT |
Sinal de CTRL+C |
SIGSEGV |
Acesso ilegal de armazenamento |
SIGTERM |
Solicitação de finalização |
Se sig não é um dos valores anterior, o manipulador inválido do parâmetro é invocado, conforme definido em Validação de parâmetro .Se a execução é permitida continuar, os conjuntos errno dessa função a EINVAL e retornam SIG_ERR.
Por padrão, signal finaliza o programa de chamada com código de saída 3, independentemente do valor de sig.
Observação |
---|
SIGINT não é suportado para qualquer aplicativo Win32.Quando uma interrupção de CTRL+C ocorre, os sistemas operacionais Win32 geram um novo thread para manipular especificamente a interrupção.Isso pode causar um aplicativo de único thread como um UNIX no desenvolvimento de vários segmentos, resultando em um comportamento inesperado. |
O argumento de func é um endereço a um manipulador de sinal que você escreva, ou a uma das constantes predefinidas SIG_DFL ou SIG_IGN, também definido em. SIGNAL.H.Se func é uma função, é instalado como o manipulador de sinal para o sinal dado.O protótipo do manipulador de sinal requer um argumento tipo, sig, do tipo int.O sistema operacional fornece o argumento real com sig ; ocorre quando uma interrupção o argumento é o sinal que gerou a interrupção.Assim você pode usar as seis constantes de manifesto (listadas na tabela acima) dentro do manipulador de sinal para determinar que ocorreu interrupção e ação apropriada recebem.Por exemplo, você pode chamar signal duas vezes para atribuir o mesmo manipulador a dois sinais diferentes, então testar o argumento de sig dentro do manipulador para executar as ações diferentes com base no sinal recebido.
Se você está testando para exceções de ponto flutuante (SIGFPE), pontos de func a uma função que recebe um segundo argumento opcional que é uma das várias constantes de manifesto definir em FLOAT.H do formulário FPE_xxx.Quando um sinal de SIGFPE ocorre, você pode testar o valor do segundo argumento para determinar o tipo de exceção de ponto flutuante e para executar a ação apropriada.Esse argumento e seus valores possíveis são extensões da Microsoft.
Para exceções de ponto flutuante, o valor de func não é redefinido em cima de receber o sinal.Para recuperar as exceções de ponto flutuante, use a tentativa/exceto as cláusulas envolvendo as operações de ponto flutuante.Também é possível recuperar usando setjmp com longjmp.Em ambos os casos, o processo de chamada continua a execução com o estado de ponto flutuante de processo deixado indefinido.
Se o manipulador de sinal retorna, o processo de chamada continua a execução imediatamente após o ponto em que recebeu o sinal de interrupção.Isso é verdadeiro independentemente do tipo de sinal ou de modo que funciona.
Antes que a função especificada seja executada, o valor de func é definido como SIG_DFL.O sinal seguir de interrupção é tratado como descrito para SIG_DFL, a menos que uma chamada interveniente a signal especificar caso contrário.Esse recurso permite redefinir sinais no papel chamado.
Porque rotinas de logon manipulador são geralmente chamadas de forma assíncrona quando ocorre uma interrupção, sua função de logon manipulador pode obter o controle quando uma operação de tempo de execução e incompleta está em um estado desconhecido.A lista a seguir resume as restrições que determinam quais papéis você pode usar em sua rotina de logon manipulador.
Não emita rotinas de baixo nível ou de STDIO.H E/S (como printf e fread).
Não chamar rotinas da heap ou nenhuma rotina que usar rotinas da heap (como malloc, _strdup, e _putenv).Consulte malloc para mais informações.
Não usa nenhuma função que gere um chamada do sistema (por exemplo, _getcwd, time).
Não use longjmp a menos que a interrupção é causado por uma exceção de ponto flutuante (ou seja, sig é SIGFPE).Nesse caso, reinicializar primeiro o pacote de ponto flutuante com uma chamada a _fpreset.
Não usa nenhuma rotinas de sobreposição.
Um programa deve conter o código de ponto flutuante se é capturar a exceção de SIGFPE com a função.Se seu programa não possui código de ponto flutuante e não requer o código de tratamento de logon biblioteca em tempo de execução, declarar apenas um double temporário e inicializá-la como zero:
volatile double d = 0.0f;
Os sinais de SIGILL e de SIGTERM não são gerados no Windows.São incluídos para compatibilidade ANSI.Assim você pode definir manipuladores de sinal para esses sinais com signal, e você também pode gerar explicitamente esses sinais chamando aumento.
As configurações de sinal não são mantidas nos processos desovados criados por chamadas a _exec ou funções de _spawn .As configurações de sinal são redefinidas para a opção no novo processo.
Requisitos
Rotina |
Cabeçalho necessário |
---|---|
signal |
<signal.h> |
Para informações extras de compatibilidade Compatibilidade na introdução, consulte.
Exemplo
O exemplo a seguir mostra o uso de signal adicionar algum comportamento personalizado ao sinal de SIGABRT .Para obter informações adicionais sobre o comportamento abort, consulte _set_abort_behavior.
// crt_signal.c
// compile with: /c
// Use signal to attach a signal handler to the abort routine
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>
void SignalHandler(int signal)
{
printf("Application aborting...\n");
}
int main()
{
typedef void (*SignalHandlerPointer)(int);
SignalHandlerPointer previousHandler;
previousHandler = signal(SIGABRT, SignalHandler);
abort();
}
Equivalência do .NET Framework
Não aplicável. Para chamar a função padrão de C, use PInvoke. Para obter mais informações, consulte Exemplos de invocação de plataforma.