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
Tópicos relacionados
- Linux
- Kernel Linux
- Administração do Sistema
Sobre o autor

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.
Assine a nossa newsletter
Junte-se à nossa newsletter para dicas de tecnologia, análises, e-books gratuitos e ofertas exclusivas!
Clique aqui para assinar