Sinais
Mecanismo Básico de Comunicação em Unix:
- Originalmente não-fiável e falha:
- 15 sinais, depois 31.
- Mecanismo:
- Geração;
- Pendente;
- Processamento: abort, exit, ignore, +
stop e continue.
- processo pode redefinir handlers e bloquear, mesmo
temporáriamente.
- qq acção tem que ser efectuada pelo próprio processo,
incluindo exit.
- BSD4.2 corrigiu e melhorou muitas coisas.
- System V evoluiu diferentemente.
- POSIX.1 implementou standard.
Ideias Básicas
- Processo chama issig() para ver se tem sinal:
- antes de retornar para user-mode (Linux testa sigpending em
arch/i386/kernel/entry.S);
- antes de bloquear num evento interruptivel
signal_pending() de include/linux/sched.h;
- logo depois de acordar de um evento interruptivel.
- Kernel chama psig() que despacha o sinal ou chama
sendsig() para chamar código do usuário.
Sinais em SVR2 e antes não eram fiáveis:
- Signal Handlers não são persistentes e operação é reset para
default antes de chamar o handler: corridas.
- Como área-u de outro processo é inacessível, tem que
acordar o outro sinal.
- Sinais não podem ser bloqueados temporáriamente.
- BSD4.2:
- Handlers são persistentes;
- Sinais podem ser mascarados temporáriamente;
- Processos adormecidos não têm que ser acordados.
- sigpause() espera por um sinal.
Grupos (BSD) estão associados a uma tarefa:
- cada processo tem um GID (setgrp muda);
- estrutura tty sabe que grupo é foreground, ie, controla
o terminal.
- Se processo com GID de 0 abre terminal, terminal passa ser o
terminal de contrôle para o processo, e processo junta-se ao
grupo do terminal. Se terminal não é controlado, processo passa ser
leader de grupo.
- Processo em foreground tem acesso irrestrito ao terminal.
- Se processo em background tenta ler do terminal, processos no
seu grupo recebem SIGTTIN; escritas são permitas por
default, ou SIGTTOU.
- o ioctl TIOCSPGRP pode mudar o dono do
terminal: usado pela shell para passar de foreground para
background.
- Quando todos os processos fecham o terminal, terminal é
disassociado e perde o dono.
- BSD pode reinicializar terminal.
- Problemas:
- Não há sessão de logins (sessions);
- nenhum processo é responsável pelo terminal;
- processo pode colocar o grupo de controle como inexistente;
- incompatível com SYSV.
- Sessões: o leader da sessão é responsável por controlar o
terminal.
Handler pode executar em diferente contexto (multi-threading):
- Vítima: causa excepção e espera resposta;
- Handler processa resposta.
Porta é uma fila protegida da mensagem:
- Várias tarefas podem ter direitos de envio;
- Apenas uma tem direitos de recepção.
- Portas de excepção podem estar associadas com threads e tasks:
- Erros estão associados a threads: o handler regista a sua
porta como a porta de excepção para o thread.
- Novo thread tem porta de excepção NULL.
- Debugger regista-se como receptor para a porta de excepção de
uma task.
- Excepções são enviadas para o thread error handler primeiro.
vitor@cos.ufrj.br