Também disponível em: English · Español · Français · العربية
Números de sinal no Linux
O número de cada sinal em cinco plataformas, a pesquisa inversa para um número solto, e a razão de os números não coincidirem.
O que são os números de sinal?
Um sinal é a maneira de um sistema Unix interromper um processo em execução: para lhe pedir que pare, para lhe dizer que um filho terminou, para o informar de que mexeu em memória onde não devia. Cada um tem um nome como SIGTERM e um inteiro pequeno, e o kill envia um por qualquer dos dois. Os nomes são fixados pelo POSIX. Os números não.
É aí que está toda a dificuldade. O POSIX normaliza que sinais existem e o que significam, e deixa a numeração a cada implementação — portanto a tabela abaixo tem cinco colunas, uma por plataforma, e bastantes linhas onde discordam.
Esta página leva os 39 sinais do manual do Linux e do cabeçalho da Apple, com o número que cada plataforma lhes atribui, se o POSIX os normaliza e o que faz a ação por omissão se não os tratar. Por cima da tabela está o controlo que mais importa: escreva um número solto e ela diz-lhe o que esse número quer dizer em todo o lado.
Como usar
- Comece pelo número, se for o que tem. Escreva-o na pesquisa inversa e obtém o sinal que ele nomeia em cada plataforma, e um aviso se discordarem. É nessa direção que o deixa uma linha de registo ou um estado de saída.
- Pesquise por nome, número ou descrição. SIGKILL, kill, 9 e pipe funcionam todos, e o nome exato aparece primeiro em vez de ficar enterrado debaixo de tudo o que apenas contém aquelas letras.
- Leia a linha toda. A ação por omissão diz-lhe o que acontece se o seu programa ignorar o sinal, e «não existe» quer dizer que o sinal não está lá de todo — um facto diferente de ter outro número.
Porque os números discordam, e porque não é ao acaso
O exemplo famoso é o SIGUSR1. É 10 em x86 e ARM, 30 em Alpha e SPARC, e 16 em MIPS e PA-RISC — três números diferentes para um nome, e todos eles Linux. A divergência não é entre sistemas operativos, é entre arquiteturas do mesmo.
Dito assim soa a chatice. Dito ao contrário é um perigo: o mesmo número quer dizer sinais diferentes. O dez é SIGUSR1 em x86 e SIGBUS em quase todo o resto, portanto um script ou um pedaço de código que fixe o 10 à mão não falha com estrondo quando corre onde não esperava. Manda um erro de barramento a um processo que esperava um sinal de utilizador, e o processo morre de uma maneira para a qual ninguém escreveu um tratador.
O reconfortante é que a discordância tem forma. Dos 31 sinais que tanto o manual do Linux como o cabeçalho da Apple definem, o macOS coincide com a coluna de Alpha e SPARC em todos sem exceção, e com x86 em apenas 19. O macOS e essas arquiteturas descendem do BSD; o Linux em x86 seguiu antes a numeração do System V. Portanto há aqui na verdade duas famílias, e uma coluna da tabela do Linux é a coluna BSD com outro rótulo.
Um punhado de números é igual em todo o lado, e por isso são os que as pessoas decoram: 1 é sempre SIGHUP, 2 sempre SIGINT, 9 sempre SIGKILL, 15 sempre SIGTERM. Esses quatro podem fixar-se à mão sem receio. Quase mais nenhum.
Limites honestos
Cinco plataformas não são todas as plataformas. O manual do Linux documenta quatro agrupamentos de arquiteturas e a Apple documenta o macOS; os outros BSD, o Solaris, o AIX e o resto têm os seus próprios cabeçalhos e não aparecem aqui. Como o sentido inteiro da página é que os números variam, trate uma ausência como «desconhecido» e não como «coincide» — a conclusão segura desta tabela é usar sempre o nome.
A tabela pára também antes dos sinais de tempo real. Vão de SIGRTMIN a SIGRTMAX, não têm nomes individuais, e o próprio SIGRTMIN não é uma constante: a biblioteca de C reserva alguns dos baixos para uso próprio, portanto o valor muda entre sistemas e até entre versões da biblioteca. Um número desse intervalo não se procura em tabela nenhuma, o que é uma versão mais forte do mesmo aviso.
E números de sinal não são códigos de saída, embora se encontrem. Uma shell reporta um processo morto pelo sinal N como estado de saída 128 mais N, portanto um estado 137 quer dizer o sinal 9 numa plataforma onde o 9 é SIGKILL. Essa aritmética é uma convenção da shell e não parte do sinal, e herda o mesmo problema de portabilidade.
Os dados são lidos do manual signal(7) do Linux e do cabeçalho xnu da Apple, não de outra tabela, e a data em que foram lidos está impressa por baixo da lista.
Porque é grátis
Porque não custa nada manter. A tabela faz parte da página e a pesquisa acontece no seu navegador; não se envia nada e nenhum servidor vê o que consultou.
O guião que lê ambas as fontes está guardado ao lado dos dados que produz, e os testes verificam pelo nome os números e a medição da árvore genealógica, portanto uma linha má parte a compilação em vez de chegar à página.