O sistema operacional enviará um sinal, que é uma interrupção gerada por software, para um processo sempre que o usuário pressiona a tecla "Ctrl-C" ou quando outro processo precisa se comunicar com o processo. Um processo só pode receber um certo conjunto de sinais. Os números inteiros servem como identificadores para sinais. Os nomes simbólicos são atribuídos aos números de sinalização. Um sinal emitido ao processo pai quando o processo de uma criança termina é Sigchld, por exemplo.
Um sinal é transmitido para um processo, que define o bit relevante nos sinais pendentes do processo. O sistema operacional examina os números inteiros pendentes e bloqueados cada vez que um processo é escolhido para executar em um processador específico. O processo é retomado corretamente e retoma a execução na próxima instrução se não houver sinais pendentes. Quando um ou mais sinais são interrompidos, mas um ou mais ainda estão pendentes, o procedimento também é continuado normalmente com os sinais ainda sendo notados como pendentes. Se um ou mais sinais não estiverem bloqueados, mas estão pendentes, o sistema operacional chama as funções de manipulação de sinal no código do processo.
Sintaxe da função de sinal na linguagem C
A função de sinal da biblioteca C cria um manipulador de sinal ou função com o número do sinal sig. A declaração da função Signal () é fornecida no seguinte:
vazio (*sinal (int sig, void (*func) (int))) (int)
Vamos discutir cada um dos parâmetros da função de sinal em detalhes. O "sig" é o número do sinal que tem uma função de manuseio associada a ele. Aqui estão alguns números cruciais de sinal padrão:
O sidabrt é denominado como terminação anormal de sinal como a que é iniciada pela função. O SIGFPE é referido como uma exceção de ponto flutuante de sinal, que é uma operação matemática inadequada, como uma divisão por zero ou uma operação transbordante (nem sempre usando uma operação de ponto flutuante.)
O sigill é o sinal ilegal e é uma instrução inválida ou uma imagem de função inválida. Geralmente, um esforço para executar uma corrupção de dados ou código é o culpado por isso. O sigint é denominado como uma interrupção de sinal que é uma sugestão de atenção interacional. O usuário do aplicativo geralmente é aquele que o gera. O SIGSEVG é a abreviação da violação da segmentação de sinal e seu acesso não autorizado a dados que acontecem quando o software tenta ler ou escrever os dados que não estão na memória que foram atribuídos a ele.
O Sigterm é o acrônimo para a terminação do sinal em que o programa recebeu um pedido de rescisão.
Um ponteiro de função é representado pelo parâmetro "func". Uma das seguintes funções predefinidas pode ser usada aqui ou uma função criada pelo programador. O SIG_DFL é o manuseio de sinal por padrão. O sinal é tratado pela resposta padrão para esse sinal específico. O sig_ign é o sinal ignorado. O sinal é desconsiderado.
Exemplo 1:
Existem várias rotinas de manipulador de sinal padrão disponíveis. Cada sinal tem uma rotina de manipulador padrão correspondente. As ações comuns executadas pelos vários procedimentos de manipulador padrão incluem a ignição do sinal, o que significa não fazer nada e simplesmente voltar. O processo deve ser encerrado. Continue liberando um processo bloqueado. Pare o procedimento bloqueando -o. Esta instância ilustra o manipulador de sinal padrão no idioma C:
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
void handle_sigint (int sig)
printf ("manipulador de sinal");
int main ()
sinal (sigint, handle_sigint);
enquanto (1)
printf ("Hello to C Language \ n");
sono (1);
retornar 0;
Junto com os outros arquivos de cabeçalho necessários, importamos o “sinal.arquivo de cabeçalho H ”. O sinal.O arquivo de cabeçalho H ”contém uma definição de macro constante para os sinais. A função handle_sigint é construída que leva o objeto inteiro "sig". Chamamos essa função dentro de nossa função principal. A principal função utilizou a chamada da função do sinal e leva os dois argumentos: o primeiro argumento é o sigint para a interrupção do sinal e o segundo argumento é o manipulador_signint para fins de manipulador de sinal. O loop while é definido, o que itera sobre a instrução PRINTF que exibe o "Hello to C Language" Times Infinitos até que o usuário pressione o comando Ctrl C C.
A string é impressa em tempos infinitos na saída. Ao receber o sinal SIGINT e usar seu manipulador padrão para encerrar o processo, o usuário pode pressionar Ctrl+C para encerrar o processo.
Exemplo 2:
Exceto pelo Sigkill, um processo pode usar seu código de manipulador para substituir o manipulador de sinal padrão por praticamente todos os sinais. Qualquer nome é aceitável para uma função de manipulador de sinal, mas deve ter um parâmetro int e um tipo de retorno de vazio. O código de exemplo a seguir é a ilustração de um manipulador de sinal definido pelo usuário:
#incluir
#incluir
void handle_sigint (int sig)
printf ("sinais capturados %d \ n", sig);
int main ()
sinal (sigint, handle_sigint);
enquanto (1);
retornar 0;
Depois de incluir o arquivo de cabeçalho, basta começar com o código. Definimos a função de um manipulador de sinal. O parâmetro int sig é passado para a função de manipulador de sinal. Esta função é o manipulador para o sigint e imprime a declaração do sinal capturado quando o usuário inserir o comando "Ctrl+C". Dentro da função principal, temos uma chamada do sistema de sinal que leva o argumento SIGINT e o argumento do Handle_Sigint.
O programa irá no While Loop e imprime a seguinte saída em cada comando “Ctrl+C”:
Conclusão
Todo esse guia educa você sobre a função de sinal em c. Passamos uma introdução aos sinais em C, juntamente com uma estrutura de sinais e seus exemplos correspondentes. Quando se trata de abordar as interrupções não planejadas que acontecem ao longo da execução de um programa durante o tempo de execução, o comando de sinal do idioma C é crucial. Como serve como um sinal para o usuário e pode detectar erros durante a execução do programa, a função de sinal pode lidar com isso com facilidade.