sinal
Conjuntos de manipulação de sinal de interrupção.
void (__cdecl *signal(
int sig,
void (__cdecl *func ) (int [, int ] )))
(int);
Parâmetros
sig
Valor de sinal.func
Função a ser executada.O primeiro parâmetro é um valor de sinal e o segundo parâmetro é um sub-code pode ser usado quando o primeiro parâmetro é SIGFPE.
Valor de retorno
signal Retorna o valor anterior da func associado com o sinal especificado. Por exemplo, se o valor anterior do func foi SIG_IGN, o valor retornado é também SIG_IGN. Um valor retornado de SIG_ERR indica um erro, caso em que errno é conjunto para EINVAL.
See _doserrno, errno, _sys_errlist e _sys_nerr para obter mais informações sobre esse e outros, retorne códigos.
Comentários
The signal função permite que um processo escolher uma das várias maneiras de lidar com um sinal de interrupção do sistema operacional. The sig o argumento é a interrupção para o qual signal responde; ele deve ser uma das seguintes constantes manifesto, definidas no SIGNAL.H.
sig valor |
Descrição |
---|---|
SIGABRT |
Anormal |
SIGFPE |
Erro de ponto flutuante |
SIGILL |
Instrução ilegal |
SIGINT |
Sinal CTRL + C |
SIGSEGV |
Acesso ao armazenamento ilegal |
SIGTERM |
Solicitação de encerramento |
If sig não é um dos valores acima, o manipulador de parâmetro inválido é chamado, conforme definido no Validação de parâmetro . Se a execução for permitida para continuar, essa função define errno para EINVAL e retornos SIG_ERR.
Por padrão, signal Encerra o programa de chamada com o código de sair 3, independentemente do valor de sig.
Observação: |
---|
SIGINT Não há suporte para qualquer aplicativo Win32. Quando ocorre uma interrupção CTRL+C, sistemas operacionais Win32 gerar um novo segmento para tratar especificamente essa interrupção.Isso pode fazer com que um aplicativo único thread sistema autônomo no UNIX para se tornar multithread, resultando em um comportamento inesperado. |
The func argumento é um endereço a um manipulador de sinal de que você escreve ou uma das constantes predefinidas SIG_DFL ou SIG_IGN, também definida em SIGNAL.H. If func é uma função, ele é instalado sistema autônomo o manipulador de sinal de sinal dado. Protótipo o manipulador de sinal do 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. Assim você pode usar seis constantes manifesto (listadas na tabela anterior) dentro do manipulador de sinais para determinar qual interrupção ocorreu e adotar a ação adequada.Por exemplo, você pode chamar signal duas vezes para atribuir o mesmo manipulador para dois sinais diferentes, em seguida, teste a sig argumento dentro do manipulador de tomar ações diferentes com base em sinal recebido.
Se você estiver testando para exceções de ponto flutuante (SIGFPE), func aponta para uma função que assume um segundo argumento opcional que é uma das diversas constantes manifesto definidos FLOAT.H do formulário FPE_xxx. Quando um SIGFPE sinal ocorre, você pode testar o valor do segundo argumento para determinar o tipo de exceção de ponto flutuante e tomar a ação apropriada. Este argumento e seus valores possíveis são extensões da Microsoft.
Para exceções de ponto flutuante, o valor de func não é reiniciar ao receber o sinal. Para recuperar de exceções de ponto flutuante, tente usar /, exceto as cláusulas em torno do flutuante aponte as operações.Também é possível recuperar usando setjmp with longjmp.Em ambos os casos, o processo de chamada continua a execução com o estado do processo indefinido à esquerda do ponto flutuante.
Se o manipulador de sinal retorna, o processo de chamada continua a execução imediatamente após o ponto em que ele recebidos o sinal de interrupção.Isso é verdadeiro independentemente do tipo de sinal ou modo de operação.
Antes que a função especificada seja executada, o valor de func é definido como SIG_DFL. O próximo sinal de interrupção é tratado sistema autônomo descrito para SIG_DFL, a menos que um interveniente telefonar para signal Especifique algo em contrário. Esse recurso permite que você redefina sinais na função de chamada.
Porque rotinas de manipulador de sinais são geralmente chamadas de modo assíncrono quando ocorre uma interrupção, sua função de manipulador de sinais poderá obter controle quando uma operação de time de execução está incompleta e em um estado desconhecido.A lista abaixo resume as restrições que determinam quais funções que podem ser usadas em sua rotina de manipulador de sinais.
Fazer não problema de baixo nível ou rotinas STDIO.H E/sistema autônomo (sistema autônomo, por exemplo, printf e fread).
Não chame sistema autônomo rotinas de pilha ou qualquer rotina que usa sistema autônomo rotinas de heap (por exemplo, malloc, _strdup, e _putenv). See malloc para obter mais informações.
Não use qualquer função que gera uma telefonar do sistema (por exemplo, _getcwd, time).
Não use longjmp a menos que a interrupção é causada por uma exceção de ponto flutuante (ou seja, sig é SIGFPE). Nesse caso, reinicialize primeiro o pacote de ponto flutuante com uma telefonar para _fpreset.
Não use qualquer rotina de sobreposição.
Um programa deve conter código de ponto flutuante se for interceptar o SIGFPE exceção com a função. Se seu programa não tem código de ponto flutuante e requer o código de tratamento de sinal da biblioteca de time de execução, basta declarar um double volátil e inicializá-lo a zero:
volatile double d = 0.0f;
The SIGILL e SIGTERM sinais não são gerados sob Windows. Elas são incluídas para compatibilidade ANSI.Assim, você pode conjunto manipuladores de sinal para esses sinais com signal, e você pode gerar explicitamente esses sinais chamando aumentar.
Configurações de sinal não são preservadas no gerado processos criados por chamadas para _exec ou _spawn funções. As configurações de sinal são redefinidas para padrão no novo processo.
Requisitos
Rotina |
Cabeçalho necessário |
---|---|
signal |
<signal.h> |
Para obter informações adicionais compatibilidade, consulte Compatibilidade na introdução.
Exemplo
O exemplo a seguir mostra o uso de signal Para adicionar algum comportamento personalizado para o SIGABRT sinal. Para obter informações adicionais sobre o comportamento de anulação, 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();
}
This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. Application aborting...
Equivalente do NET Framework
Não aplicável. Para telefonar a função C padrão, use PInvoke. Para obter mais informações, consulte Exemplos de invocação de plataforma.