Programação C

Sinais POSIX com programação C

Sinais POSIX com programação C
Podemos definir um sinal como uma atividade que é acionada para alertar uma operação ou thread sempre que chegar a hora de uma determinada situação significativa. Sempre que um procedimento ou thread reconhece um sinal, o procedimento ou thread irá parar tudo o que estiver fazendo e tomar uma ação imediata. Na coordenação entre processos, o sinal pode ser eficaz. Neste guia, você estudará manipuladores de sinal no Linux por meio da linguagem C.

Sinais padrão ou regulares:

O sinal do arquivo de cabeçalho.h 'tem sinais especificados como uma constante macro. O título do sinal começa com "SIG" e é precedido por uma breve visão geral do sinal. Consequentemente, qualquer sinal tem um valor numérico distinto. O código do programa deve usar o nome do sinal, não vários sinais. A causa por trás disso é que o número de sinais pode variar dependendo do sistema, mas a interpretação dos nomes é padrão. Abaixo estão alguns sinais regulares com suas funcionalidades definidas.

SIGHUP:

Este sinal irá desligar o processamento. O sinal SIGHUP está sendo lançado para indicar a desassociação do terminal do usuário, provavelmente devido a uma comunicação remota sendo interrompida ou desligada.

SIGINT:

Isso vai atrapalhar o processo. O sinal SIGINT é recebido sempre que o usuário insere a tecla INTR (geralmente Ctrl + C).

SIGQUIT:

Vai parar ou sair do processamento. O sinal SIGQUIT é recebido sempre que o usuário insere a tecla QUIT (geralmente Ctrl + \).

SIGILL:

Ele é executado quando um comando ilícito é feito. O sinal SIGILL é criado sempre que um esforço está sendo feito para executar um lixo ou comando privilegiado. Sempre que a pilha estourar e a máquina tiver problemas para executar um controlador de sinal, SIGILL também pode ser criado.

SIGTRAP:

É chamado quando alguma instrução de rastreamento de rastreamento está sendo executada. O sinal SIGTRAP é criado por um comando de ponto de interrupção e outro comando trap. O depurador usa tal sinal.

SIGABRT:

É chamado de sinal de aborto. O sinal SIGABRT é criado chamando o método abort (). Tal sinal é usado para apontar a imprecisão observada pelo código acima mencionado e registrada pela chamada do método abort ().

SIGFPE:

Exceção para pontos flutuantes; O sinal SIGFPE é produzido quando ocorre um erro matemático catastrófico.

SIGUSR1 e SIGUSR2:

Os sinais SIGUSR1 e SIGUSR2 podem ser usados ​​da maneira que você quiser. É benéfico para uma fácil interação entre processos criar um manipulador de sinal para esses sinais no aplicativo que obtém o sinal.

Comportamento padrão dos sinais:

Existe um comportamento ou ação padrão para cada sinal, e é possível ajustar o comportamento padrão usando a função de manipulador. O comportamento automático do sinal SIGKILL e SIGABRT não pôde ser modificado ou negligenciado.

Prazo: Isso vai encerrar a operação.

Testemunho: Um documento de despejo central será gerado e a operação será encerrada.

Ign: O processo ignoraria um sinal.

Pare: Isso vai parar a operação.

Cont: A operação não será interrompida.

Tratamento de sinais:

O processo tem uma preferência de comportamento para um sinal quando ele é confirmado. O processo pode se comportar da seguinte forma:

O sinal é descartado automaticamente quando o comportamento do sinal definido é esquecido.

Usando métodos como sinal ou sigação, o código pode registrar uma função de manipulador. É chamado de pegar um sinal de um manipulador.

Se um sinal não está sendo tratado ou negligenciado, a ação padrão pode ocorrer.

Você pode definir a função de Manuseio de Sinal como:

$ Int signal () int signum, void (* funk) (int))

Quando o processamento obtém um signum de sinal, o método signal () pode chamar o método 'func'. Signal () reverte um ponteiro para o método 'func' se for próspero ou uma exceção for retornada para errno e -1 ao invés.

O ponteiro 'func' é capaz de ter três valores:

SIG_DFL: Este é um ponteiro para o método SIG DFL () padrão, definido no cabeçalho.documento h usado para obter o comportamento padrão do sinal.

SIG_IGN: Esta é uma referência ao método SIG IGN () ignorar, especificado no cabeçalho.documento h.

Ponteiro de método do manipulador definido pelo usuário: O tipo de método manipulador definido pelo usuário void (*) (int), implica que a categoria de retorno é nula e que o argumento solitário é int.

Criar um novo sinal de arquivo.c 'e escreva abaixo o código do manipulador de sinal nele.

Ligue o sinal.arquivo c com gcc.

Durante a execução do sinal.arquivo c, temos um loop infinito sendo executado no método principal. Ao pressionar CTRL + C, iniciou o método do manipulador, e a execução do método principal parou. O processamento do método principal continuou após a realização do método manipulador. Ao pressionar Ctrl + \, a operação é encerrada.

Ignorar sinal:

Para ignorar o sinal, crie um sinal de arquivo.c 'e escrever sob o código nele.

Amarre o ignorar.arquivo c com gcc.

Execute o sinal.arquivo c. Toque em CTRL + C, o sinal SIGNIT é criado; no entanto, o comportamento passa despercebido porque o método do manipulador é enumerado para o método SIG_IGN ().

Registre novamente o manipulador de sinais:

Para registrar novamente o manipulador de sinal, crie um novo arquivo 'rereg.c 'e inscreva o código abaixo nele:

Associar o novo registro.arquivo c com gcc.

Execute o novo registro.arquivo c. Ao pressionar CTRL + C pela primeira vez, o método do manipulador foi gerado e o manipulador de sinal foi registrado novamente em SIG_DFL. Enquanto pressionava CTRL + C novamente, a execução foi encerrada.

Envie sinais usando Raise ():

Criar um arquivo 'enviar.c 'e adicione o código abaixo. Para enviar sinais para o método de chamada, o método raise () é usado.

Relacionar o envio.arquivo c com gcc.

O processo utiliza o método raise () para transmitir o sinal SIGUSR1 por conta própria.

Envie sinais usando kill ():

Adicione o código abaixo em 'raise.c '. Use o método kill () para enviar sinais para o grupo de processo.

Ligue o aumento.arquivo c com gcc.

Usando o método kill (), o processo direciona o sinal SIGUSR1 para o referido.

Interação pai-filho:

Para assistir à interação entre pais e filhos, escreva o código abaixo em um arquivo.

Ligue o comunicador.arquivo c com gcc.

Fork () / método gera filho, reverte zero para o processo filho e ID filho para pai.

Conclusão:

Neste guia, vimos como criar, manipular, enviar, ignorar, registrar novamente e usar o sinal para interação entre processos no Linux.

Como aumentar o FPS no Linux?
FPS significa Quadros por segundo. A tarefa do FPS é medir a taxa de quadros em reproduções de vídeo ou desempenho de jogos. Em palavras simples, o nú...
Top jogos do Oculus App Lab
Se você é proprietário de um fone de ouvido Oculus, deve estar informado sobre o carregamento lateral. Sideload é o processo de instalação de conteúdo...
Os 10 melhores jogos para jogar no Ubuntu
A plataforma Windows tem sido uma das plataformas dominantes para jogos devido à grande porcentagem de jogos que estão sendo desenvolvidos hoje para o...