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