Sinais
Seminário de Lab. SO – Etapa 1
Alunos:
Agostinho Barone Ribeiro da Silva – 264300
Vinicius Valls Blanch Maimone Santos – 264385
O que é um sinal?
O que é um Sinal?
• Um sinal é uma pequena mensagem que pode ser
enviada a um processo ou grupo de processos.
• A única informação fornecida ao processo
geralmente é o código identificador do sinal.
• Não há espaço em sinais padrões para argumentos,
mensagens ou outras informações.
O que é um Sinal?
• Sinais têm dois propósitos principais:
– Deixar um processo ciente de que algum evento ocorreu.
– Fazer com que um processo execute uma função de
tratamento embutida em seu código.
• Estes dois propósitos não são mutuamente
exclusivos.
Os Sinais
Os Sinais
• Para a arquitetura x86, o kernel 2.6 do Linux
trata 31 sinais por padrão.
• O padrão POSIX introduziu uma nova classe de
sinais (32~64), chamados real-time signals.
• A diferença básica entre estes é que os realtime signals são enfileiráveis.
• Apesar do kernel não suportá-los, é possível
utilizá-los através de algumas syscalls.
Os Sinais
• Alguns sinais:
#
Nome
Ação
Descrição
1
SIGHUP
Terminar
Enforca o terminal ou processo
2
SIGINT
Terminar
Interrupção do Teclado
9
SIGKILL
Terminar
Força o processo a terminar
11
SIGSEGV
Dump
Referência inválida de memória
13
SIGPIPE
Terminar
Escrita num pipe já fechado
15
SIGTERM
Terminar
Termina um processo
17
SIGCHLD
Ignorar
Processo filho parou ou terminou
18
SIGCONT
Continuar
Continua um processo parado
19
SIGSTOP
Parar
Para a execução de um processo
Os Sinais
• Algumas chamadas de sistema permitem:
– Enviar sinais.
– Determinar a resposta dos processos ao
receberem um sinal.
Os Sinais
• As principais syscalls relativas a sinais:
syscall
Descrição
kill()
Envia um sinal a um grupo de threads
tkill()
Envia um sinal a um processo
tgkill()
Envia um sinal a um processo num grupo
específico de threads
sigaction() / signal()
Altera a ação associada a um sinal
sigpending()
Checa se há sinais pendentes
sigprocmask()
Modifica o conjunto de sinais bloqueados
sigsuspend()
Espera um sinal
Os Sinais
• As syscalls relativas a sinais real-time:
syscall
Descrição
rt_sigaction()
Altera a ação associada a um sinal
rt_sigpending()
Checa se há sinais pendentes
rt_sigprocmask()
Modifica o conjunto de sinais bloqueados
rt_sigqueueinfo()
Envia um sinal para um grupo de threads
rt_sigsuspend()
Espera um sinal
rt_sigtimedwait()
Similar a rt_sigsuspend()
Os Sinais
• Sinais podem ser enviados a qualquer
momento a qualquer processo.
• Se este processo não estiver sendo executado
o sinal deve ser salvo pelo kernel até que o
processo retorne.
• Bloquear um sinal faz com que o kernel o
salve até que sua entrega seja desbloqueada.
• Isso evita que sinais sejam capturados antes
de poderem ser tratados.
Os Sinais
• Assim, o kernel divide a transmissão do sinal
em duas fases:
– Geração do sinal:
• O kernel atualiza a estrutura de dados do processo de
destino para representar que um sinal foi enviado.
– Entrega do sinal:
• O kernel força o processo de destino a reagir:
– Mudando seu estado de execução.
– Iniciando a execução da rotina de tratamento.
– Realizando ambos os procedimentos.
Os Sinais
• Apesar da noção de sinais ser intuitiva, a
implementação é complexa. O kernel deve:
– Lembrar os sinais bloqueados de cada processo.
– Quando alterna entre Kernel Mode e User Mode,
checar se algum sinal chegou a algum processo.
– Determinar se o sinal pode ser ignorado.
– Tratar o sinal (isso pode exigir troca de contexto).
Ações de Resposta
Ações de Resposta
• Ao receber um sinal, um processo pode:
– Ignorar o sinal explicitamente.
– Tratar o sinal através de uma função específica.
– Executar a ação padrão associada ao sinal.
Ação
Descrição
Terminar
O processo é terminado
Dump
O processo é terminado e um “core dump” é criado
Ignorar
O sinal é ignorado
Parar
O processo é parado (i.e. Estado TASK_STOPPED)
Continuar
O processo em TASK_STOPPED é colocado em TASK_RUNNING
Estruturas de Dados
Estruturas de Dados
• As estruturas de dados mais significativas no tratamento de
sinais:
Gerando um Sinal
Gerando um Sinal
• Quando um sinal é enviado a um processo, oriundo do kernel
ou de outro processo, uma das seguintes funções é chamada:
Função
Descrição
send_sig()
Envia um sinal a um único processo
send_sig_info()
Como o send_sig(), mas com mais informações
force_sig()
Envia um sinal que não pode ser ignorado ou bloqueado.
force_sig_info()
Como force_sig(), mas com mais informações
force_sig_specific()
Como force_sig(), mas otimizado para SIGSTOP e SIGKILL
sys_tkill()
syscall handler para a função tkill()
sys_tgkill()
syscall handler para a função tgkill()
Gerando um Sinal
• Quando um sinal é enviado para um grupo de threads, o
kernel chama uma das seguintes funções:
Função
Descrição
send_group_sig_info()
Envia um sinal para um grupo de threads identificado
pelo descritor de processo de um de seus membros
kill_pg()
Envia sinal p/ todos os grupos de threads num grupo
de processos
kill_pg_info()
Como kill_pg(), mas com informações adicionais
kill_proc()
Envia sinal p/ grupo de threads identificado pelo pid de
um dos membros
kill_proc_info()
Como kill_proc(), mas com informações adicionais
sys_kill()
syscall handler para a função kill()
sys_rt_sigqueueinfo()
syscall handler para a função rt_sigqueueinfo()
Tratando um Sinal
Tratando um Sinal
• A figura abaixo ilustra o fluxo de execução na captura
de um sinal:
Tratando um Sinal
• A figura abaixo ilustra um frame, estrutura utilizada
para armazenar o contexto do sistema:
Bibliografia
• Understanding Linux Kernel 3
• for ($i=1; i<=5; i++)
• {
echo “http://www.comp.ufscar.br/~helio/Lab_SO/sinais”.$i;
}
• http://elearning.algonquincollege.com/coursemat/Test/allisor
/cst8229/lectures/4-Signals.html
Download

Slide 1