“Enquanto dirige na beira da estrada, o que você faz quando tiver um encontro com um sinal vermelho? Você para de dirigir por um tempo para esperar sua vez até que o sinal fique verde. Da mesma forma, quando um sinal tem uma cor laranja, você continua dirigindo e nunca para. Os sinais POSIX funcionam da mesma forma que o sinal de trânsito funciona. A biblioteca de sinais POSIX criou uma função muito simples a ser utilizada no código C para gerar sinais, fazer seus programas aguardarem a execução deles e muito mais. Este artigo estaria demonstrando todas essas funções de sinal. Temos iniciado nossos exemplos com a criação e a abertura de um arquivo C.”
Exemplo 01
Dentro do primeiro exemplo de sinais POSIX, vamos demonstrar o uso de uma função simples () para criar e invocar um sinal. Portanto, estamos usando o sinal.biblioteca de C para utilizar as funções de sinal, o stdio.A biblioteca H é usada para funções padrão de saída e entrada e o unistd.h biblioteca é usada para usar estruturas definidas pelo usuário, i i.e., funções. O código contém uma função de manipulador simples chamada "Handle" com argumento do tipo inteiro "S.”Esta variável“ s ”estará funcionando como um sinal. Ele contém uma instrução Printf simples para enviar um sinal "Pare" para o usuário.
A função Main () começa criando um sinal usando a função "sinal" aqui enquanto usa sua opção "SIGINT" para inicializar um sinal e a função "Handle" para usar essa função como um manipulador de sinal. O loop "for" começa em "1", mas não tem fim, eu.e., Isso vai incrementar, mas nunca para até você fazer isso sozinho saindo do programa. O loop contém uma instrução printf de C para exibir que estamos atualmente na função principal (). Ao utilizar o atalho Ctrl+C, podemos invocar a função Handle () para exibir uma mensagem de sinal.
Em cada iteração do loop "para", ele dorme por 5 segundos e depois fica incrementado. Vamos executar nosso código C Signal C depois de salvar e remover corretamente seus erros.
#incluirQuando você executa este programa com o compilador de "C" e o executa com o ".a/.Fora ”, você verá uma execução infinita do thread principal ().
Quando pressionamos "Ctrl+C" para invocar a função do manipulador de sinal, a função Handle () é executada e exibiu "Stop" no momento. Depois disso, o controle vai novamente para o método Main () e novamente começa a executar sua instrução PRIMF usando o loop infinito "para". Pressionamos a tecla de atalho "Ctrl+Z" para interromper com força este programa.
Digamos que você queira ignorar o sinal invocado por um usuário. Isso pode ser feito usando o parâmetro sig_ign da função Signal () sem usar qualquer função de manipulador. Estamos usando o mesmo código com uma ligeira alteração na função Signal (). Usando esta função, quando um usuário chama um sinal usando o atalho "Ctrl+C", o programa ignora o sinal e continua a executar o encadeamento da função principal (). Vamos salvar e executar rapidamente este programa para ver a saída.
#incluirApós essa execução de código, a instrução PRINCIPEL () FUNCTION PRIMPF () continua a executar mesmo depois de usar o atalho "Ctrl+C". Então, paramos com força o programa no final.
Exemplo 02
Se você deseja aumentar automaticamente um sinal para o seu programa C sem usar a tecla de atalho Ctrl+C, você também pode fazer isso utilizando a função Raise () da Biblioteca de Sinais. Portanto, atualizamos o código do primeiro exemplo e adicionamos uma função Handle () mais uma vez. A função Main () começa com a criação de um sinal usando a função Signal (), passando uma opção "SIGUSR1" com a função "Handle" nos parâmetros. Esta opção SIGUSSR1 é a chave para gerar um sinal automático. O loop "for" dorme por 10 segundos depois de executar a instrução PRINTF e depois chama a função Raise () com a opção SIGUSR1 para gerar um sinal automático chamando a função "Handle". É isso; Estamos prontos para executar este programa por enquanto.
#incluirApós a compilação bem -sucedida, a execução ocorre. O Thread Main () Gpt é executado e o programa dorme por 10 segundos enquanto estiver no loop.
Após 10 segundos, a função Raise foi invocada para gerar um sinal automático chamando a função de manipulação. A execução dorme pelos próximos 5 segundos na função de alça.
O controle é devolvido à função principal () "Loop", e esse processo continua até você sair do programa de bom grado usando o atalho Ctrl+Z.
Assim como o seu sinal automático para o seu programa, você também pode matar o sinal depois de invocar e enviar o sinal para um grupo de processamento. Em outras palavras, a função "Kill" da biblioteca Posix C Signals foi usada para enviar alertas para o grupo do programa. Portanto, atualizamos nosso programa principal, juntamente com sua função de manipulação no código de imagem acima da garagem. O objeto PID_T é usado para criar um ID "P" para o processo. A função Signal () é chamada aqui para criar um sinal através do uso da função Handle () definida antes da função principal.
A função getpid () é chamada dentro do loop "for" para obter o ID do processo deste tópico e salvá -lo em uma variável "P". Esse ID do processo “P” é passado para a função “Kill” junto com a opção SIGUSR1 para matar o sinal e enviar seu relatório para um grupo de progresso. Em seguida, um programa dorme por 8 segundos e imprime "de volta", enquanto o loop continua.
#incluirA função é executada, envia o sinal para o grupo de processos e dorme por 8 segundos.
O "Back in Main" foi executado e o loop continuou o mesmo processamento.
Conclusão
Este guia tem demonstrado o uso de funções de sinal no programa C para tornar seu ambiente de trabalho mais eficiente. Para isso, tentamos a função Signal () do POSIX, Kill () e Raise () função junto com as opções SIGINT, SIG_IGN e SIGUSR1 nas funções.