Posix sinais em c

Posix sinais em c

“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.

#incluir
#incluir
#incluir
alça de vazio (int s)
printf ("\ ntop… \ n");

int main ()
sinal (sigint, alça);
para (int i = 1 ;; i ++)
printf ("%d: main… \ n", i);
sono (5);
retornar 0;

Quando 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.

#incluir
#incluir
#incluir
int main ()
sinal (sigint, sig_ign);
para (int i = 1 ;; i ++)
printf ("%d: ignorando o sinal… \ n", i);
sono (5);
retornar 0;

Apó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.

#incluir
#incluir
#incluir
alça de vazio (int s)
printf ("\ nRaise… \ n");
sono (5);

int main ()
sinal (SIGUSR1, alça);
para (int i = 1 ;; i ++)
printf ("%d: main… \ n", i);
sono (10);
aumento (SIGUSR1);
retornar 0;

Apó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.

#incluir
#incluir
#incluir
alça de vazio (int s)
printf ("\ ntop… \ n");

int main ()
pid_t p;
sinal (SIGUSR1, alça);
para (int i = 1 ;; i ++)
printf ("%d: main… \ n", i);
p = getpid ();
matar (P, Sigur1);
sono (8);
printf ("de volta em principal \ n");
retornar 0;

A 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.