Sinais Seminário de Lab. SO – Etapa 1 Alunos: Agostinho Barone Ribeiro da Silva – 264300...

Preview:

Citation preview

SinaisSeminá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 real-time 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

Recommended