O mecanismo de sinalização no kernel do Linux permite que aplicativos em execução notifiquem de forma assíncrona o sistema quando um novo evento ocorrer. Devido à sua natureza, esse mecanismo de sinalização é geralmente conhecido como interrupções de software. Assim como as interrupções de hardware, os sinais interrompem o fluxo normal de um aplicativo e é imprevisível quando um aplicativo receberá um sinal.

Vamos mergulhar fundo no mecanismo de sinalização no Linux e entender o que acontece nos bastidores.

Conceitos básicos de sinais no Linux

No Linux, os processos geram sinais em três situações básicas:

  • Quando ocorre uma situação excepcional no lado do hardware. Por exemplo, você pode pensar em eventos como o aplicativo tentando acessar uma região fora do espaço de endereçamento permitido (falha de segmentação) ou código de máquina gerador que inclui uma divisão por zero Operação.
  • Situações como o uso de combinações de teclas como Ctrl+C ou Ctrl+Z no console pelo usuário, redimensionando a tela do console ou enviando um sinal de kill.
  • O temporizador definido na aplicação expira, o limite de CPU dado à aplicação é alto, os dados chegam a um descritor de arquivo aberto, etc.

O conceito de sinais existe desde as primeiras versões do Unix. Anteriormente, havia várias diferenças entre as versões do Unix em relação ao processamento de sinal. Mais tarde, com a padronização POSIX feito para gerenciamento de sinal, o Linux e outros derivados do Unix começaram a seguir esses padrões. Por esta razão, os conceitos de sinais Unix e sinais POSIX, que você pode encontrar em alguns documentos, apontam para as diferenças.

Números de sinal

Os sinais têm vários valores numéricos, começando com um. Por exemplo, o sinal 1 é um HUP sinal em quase todos os sistemas, ou o sinal 9 é um MATAR sinal.

No entanto, o uso desses números é fortemente desencorajado quando você usa sinais em seus aplicativos. Para sinais POSIX, sinal.h arquivo deve estar no aplicativo e o desenvolvedor deve usar as definições constantes de números relacionados, como SIGA, SIGKILL, etc em vez de.

Se você examinar o /usr/include/signal.h arquivo em seu sistema, você pode ver as operações adicionais e outros arquivos incluídos observando as definições de valores, como __USE_POSIX, __USE_XOPEN, __USE_POSIX199309, etc no arquivo. Você pode encontrar os números de sinal disponíveis em sistemas Linux no /usr/include/asm-generic/signal.h arquivo, que você não precisa incluir diretamente no código do aplicativo.

Geração e envio de sinal

A geração de sinal ocorre devido a um evento. No entanto, o envio (entrega) do sinal para o aplicativo relevante não ocorre simultaneamente com a geração do sinal.

Para que o sinal seja enviado ao aplicativo, o aplicativo deve estar em execução e possuir recursos de CPU. Portanto, o envio de um sinal para um aplicativo específico ocorre quando o aplicativo relevante começa a funcionar novamente após a troca de contexto.

O Conceito de Sinal Pendente

Durante o tempo desde a geração até a transmissão do sinal, os sinais estão em estado de espera. Você pode acessar o número de sinais pendentes e o número de sinais pendentes permitidos para um processo a partir do /proc/PID/status Arquivo.

# Para um processo com PID: 2299
cat /proc/2299/status

# Resultado
...
SigQ: 2/31630
...

Máscaras e bloqueio de sinal

A hora exata em que os sinais chegarão geralmente é imprevisível pelo aplicativo. Portanto, algumas interrupções críticas podem ocorrer durante qualquer operação. Isso pode causar grandes problemas para um aplicativo em grande escala.

Para evitar algumas situações indesejáveis ​​como esta, é necessário o uso de máscaras de sinalização. Assim é possível bloquear alguns sinais antes de uma operação crítica. Nesta fase, é importante completar a parte crítica e remover os blocos definidos. Esse processo é algo que o desenvolvedor de aplicativos deve prestar atenção.

Quando a aplicação bloqueia um sinal, outros sinais do mesmo tipo gerados ficarão em estado de espera até serem desbloqueados. Na aplicação, o envio de sinais pendentes também é fornecido assim que o bloqueio for removido.

Desta forma, os mesmos tipos de sinais colocados em espera no momento do bloqueio são enviados para a aplicação apenas uma vez após a remoção do bloqueio em uso normal. A situação é diferente para sinais em tempo real.

Tipos de sinal do Linux

As ações padrão podem variar de acordo com os tipos de sinal. Se o aplicativo que recebe o sinal correspondente não tiver uma função de manipulador de sinal, a ação padrão ocorre. Às vezes, isso significa encerrar o aplicativo e, às vezes, ignorar o sinal.

Alguns sinais não podem ser capturados na camada de aplicação, esses sinais sempre executam a ação padrão (como o sinal KILL).

Além de algumas ações que fazem com que um aplicativo seja encerrado, um arquivo de dump principal também é produzido. Arquivos de despejo de núcleo, criados escrevendo a tabela de memória virtual do processo relacionado no disco, ajudam o usuário examine as informações de estado antes que o processo termine com ferramentas de depuração nas próximas etapas.

Os valores a seguir são baseados em um arquitetura MIPS exemplar:

Sinal Número Ação padrão Pode ser pego?
SIGA 1 Encerrar aplicação Sim
SIGINT 2 Encerrar aplicação Sim
SIGQUIT 3 Encerrar aplicativo (despejo de núcleo) Sim
SIGILL 4 Encerrar aplicativo (despejo de núcleo) Sim
SIGTRAP 5 Encerrar aplicativo (despejo de núcleo) Sim
SIGABRT 6 Encerrar aplicativo (despejo de núcleo) Sim
SIGFPE 8 Encerrar aplicativo (despejo de núcleo) Sim
SIGKILL 9 Encerrar aplicação Não
SIGBUS 10 Encerrar aplicativo (despejo de núcleo) Sim
SIGSEGV 11 Encerrar aplicativo (despejo de núcleo) Sim
SIGSYS 12 Encerrar aplicativo (despejo de núcleo) Sim
SIGPIPE 13 Encerrar aplicação Sim
SIGALRM 14 Encerrar aplicação Sim
SIGTERM 15 Encerrar aplicação Sim
SIGUSR1 16 Encerrar aplicação Sim
SIGUSR2 17 Encerrar aplicação Sim
SIGCHLD 18 Ignorar Sim
SIGTSTP 20 Pare Sim
SIGURG 21 Ignorar Sim
SIGPOLL 22 Encerrar aplicação Sim
SIGSTOP 23 Pare Não
SIGCONT 25 Continuar se parado Sim
SIGTIN 26 Pare Sim
SIGTTOU 27 Pare Sim
SIGVTALRM 28 Encerrar aplicação Sim
SIGPROF 29 Encerrar aplicação Sim
SIGXCPU 30 Encerrar aplicativo (despejo de núcleo) Sim
SIGXFSZ 31 Encerrar aplicativo (despejo de núcleo) Sim

Ciclo de vida dos sinais no Linux

Os sinais passam por três estágios. Eles são produzidos principalmente na fase de produção, pelo kernel ou qualquer processo, e são representados por um número. Eles funcionam de forma leve e rápida, pois não têm nenhuma carga extra sobre eles. Mas se você olhar para o lado POSIX, verá que sinais em tempo real podem transmitir dados extras.

A fase de entrega dos sinais vem após a fase de produção. Normalmente, os sinais chegam ao aplicativo do kernel o mais rápido possível. No entanto, às vezes, os aplicativos podem bloquear sinais ao realizar operações críticas. Nesses casos, o sinal permanece pendente até que a transação ocorra.

Assim como os sinais, os processos também são parte integrante do ecossistema Linux. Compreender o que são os processos e como eles funcionam é crucial se você planeja se tornar um administrador de sistemas Linux.

O que é um processo no Linux?

Leia a seguir

CompartilharTweetCompartilharE-mail

Tópicos relacionados

  • Linux
  • Kernel Linux
  • Administração do Sistema

Sobre o autor

Fatih Küçükkarakurt (9 Artigos Publicados)

Um engenheiro e desenvolvedor de software que é fã de matemática e tecnologia. Ele sempre gostou de computadores, matemática e física. Ele desenvolveu projetos de mecanismos de jogos, bem como aprendizado de máquina, redes neurais artificiais e bibliotecas de álgebra linear. Além disso continua a trabalhar em aprendizado de máquina e matrizes lineares.

Mais de Fatih Küçükkarakurt

Assine a nossa newsletter

Junte-se à nossa newsletter para dicas de tecnologia, análises, e-books gratuitos e ofertas exclusivas!

Clique aqui para assinar