Interacção por sinais no Unix. José C. Cunha, DI-FCT-UNL

Documentos relacionados
Programação de sistema UNIX

5. Comunicação entre processos - Sinais

Programação de Sistemas

Eventos. Rotinas Assíncronas

IP I C P n o n U N U IX I Sinais

Tratamento de Sinais

MC514 Sistemas Operacionais: Teoria e Prática 1s2010. Processos e sinais

Sinais: eventos assíncronos

Sinais. Sinais e fork. Sinais e exec. Segunda aula. Chamada ao sistema fork Chamada ao sistema execve. José Pedro Oliveira

Modelo de Sinais do Unix (1)

Modelo de Sinais do Unix (1)

Arquitetura de Sistemas Operativos

Comunicação entre Processos 9/21/17 1

Sistemas Operativos: Processos

Tratamento de sinais em sistemas UNIX

Sistemas Operativos. Processos, threads e eventos. Rui Maranhão

Comunicação baseada em canais de I/O e Pipelines no sistema Unix. José C. Cunha, DI-FCT/UNL

Modelo de Eventos (1)

Processos. Sistemas Operativos 2009 / Multiprogramação

Processos. processos UNIX e Linux threads em Linux. Taisy Weber

1. Processos. Núcleo, Processos e Tarefas. Page 1. Processo Processo Processo. Sistemas Operativos 2011 / Departamento de Engenharia Informática

Processos. Sistemas Operativos 2008 / Multiprogramação

Processos. Programas e Processos. Aula 1 - Chamadas ao sistema. José Pedro Oliveira fork exit getpid, getppid wait, waitpid

LEIC/LERC 2008/09. Repescagem do Primeiro Teste de Sistemas Operativos

Sistemas Operacionais II

Interrupções, Exceções e Chamadas ao SO

Sistemas de Computação O Sistema Operacional Unix

3. Criação e terminação de processos

! Os primeiros computadores permitiam a execução de apenas um programa de cada vez, com acesso completo aos recursos do sistema

SVCs para Controle de Processos no Unix (cont.) Sistemas Operacionais

LEIC/LERC 2008/09. 2º Exame de Sistemas Operativos

Sistemas Operacionais Aula 4

SVCs para Controle de Processos no Unix (cont.) Sistemas Operacionais

Processos. Conceitos Básicos

Sistemas Operacionais. Conceito de Processos

Threads. Agenda. Threads. Processo. Processo. Processo. Processo. (c) Volnys B. Bernal Versão de 22/3/2012

Interrupções por hardware

PCS-2529 Introdução aos Processadores. Prof. Dr. Paulo Sérgio Cugnasca

Sistemas Operacionais

Sistemas Operacionais I

Exceções no Fluxo de Execução: Interrupções e Traps

Processos. Conceitos Básicos

PCS2042 Sistemas Operacionais. Visão geral de processos no Minix

Sistemas Operacionais I

PROGRAMAÇÃO DE MICROPROCESSADORES 2011 / 2012

Processos. Processo (1) Processo (2) Processo (3) Conceitos Básicos

Processos. Conceitos Básicos

Processos. Sistemas Operativos 2015 / Multiprogramação. Execução, em paralelo, de múltiplos programas na mesma máquina

Processos. Sistemas Operativos 2011 / Multiprogramação. Execução, em paralelo, de múltiplos programas na mesma máquina

Complementos de Programação. Engenharia Electrotécnica - Electrónica e Computadores. Ano Lectivo: 2005/2006. Ana Madureira. Gestão de Processos

Processos. Volnys Borges Bernal. Edson Toshimi Midorikawa

Canais de Comunicação

14/05/2017. Conceitos de Processos. Conceitos de Processos. Conceito de processo

Programação de Sistemas. Tubos

Sistemas Distribuídos Aula 2

A D M I N I S T R A Ç Ã O D E S I S T E M A S / P E D R O B R A N D Ã O REFERÊNCIAS DOS SLIDES

Nível da Arquitetura do Conjunto das Instruções

Sistema de Controlo com Acesso Remoto

Arquitectura e Sistemas de Computadores I

MC504 Sistemas Operacionais MC514 Sistemas Operacionais: Teoria e

Sistemas Operacionais Processos. Carlos Ferraz Jorge Cavalcanti Fonsêca

- pid do último processo a manipular o semáforo (através de semop/semctl); - o número de processos que estão à espera que o valor do semáforo seja 0.

Periféricos e Interfaces Ano lectivo 2003/2004 Docente: Ana Paula Costa. Aula Teórica 8

Sistemas Operacionais

Noções de Processos. Plano da aula. Serviços oferecidos. Definição & Objetivos. Definição & Objetivos. Sistemas Operacionais : introdução

Acetatos de apoio às aulas teóricas

Arquitetura de Computadores Sistemas Operacionais II

Semáforos em Unix. Criar um conjunto (vetor) de semáforos: semid = semget ( chave, nsems, flag); onde:

Sistemas Operacionais

Sistemas Operativos: Implementação de Processos

Teste de Sistemas de Operação 15 de Abril de 2010

PROGRAMAÇÃO DE MICROPROCESSADORES 2007 / 2008

Estruturas de Sistemas Operacionais

Departamento de Ciência de Computadores

AULA ANTERIOR: MODELOS FUNDAMENTAIS

1/24 FICHEIROS DE TEXTO

Sistemas Distribuídos Aula 5

Sistemas de Informação. Sistemas Operacionais

3. Linguagem de Programação C

Unix: Processos e o Kernel. Sistemas Operacionais

Unix: Processos e o Kernel

Processo. Gerência de Processos. Um programa em execução. Centro de Informática/UFPE :: Infraestrutura de Software

Abortar a execução dum programa

Prof. Kleber R. Rovai

Processos ao nível do SO

Processos. Um SO executa uma multiplicidade de programas, em batch ou time-sharing, que se designam por: ÈÖÓ Ó é um programa em execução.

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Processo. Gerência de Processos. Um programa em execução. Centro de Informática/UFPE :: Infraestrutura de Software

SVCs para Controle de Processos no Unix

C Comandos de Controle

Sistemas Operacionais. BSI / UAB 2013 Hélio Crestana Guardia

Processos. Pedro Cruz. EEL770 Sistemas Operacionais

Entrada e Saída. Tópicos de E/S

Processos, tarefas e núcleo

Sistemas Operacionais

Execução Concorrente

Manual do Utilizador Brother Meter Read Tool

Arquitetura de Sistemas Operativos

Transcrição:

Interacção por sinais no Unix José C. Cunha, DI-FCT-UNL

Notificações assíncronas (sinais) Informar de situações imprevisíveis: podem ou não ocorrer durante a execução se ocorrerem, não se sabe quando Exemplos: erros inesperados no programa (violação da protecção de memória, divisão por zero ) acções desencadeadas pelo utilizador (ex: pede para abortar o processo) um processo notifica outro sobre qualquer evento

Sinais no sistema Unix Mecanismo software semelhante às interrupções do hardware oferecido pelo SO aos processos permitindo a estes reagirem à ocorrência de um evento Inclui apenas um identificador (num. inteiro) O envio dum sinal é assíncrono podem ser gerados/enviados independentemente da execução do programa do processo "receptor" e a recepção é implícita uma função no receptor (handler) é executada quando o sinal ocorre

Geração de sinais Um sinal é gerado pelo SO como consequência de um evento: provocado pelo próprio processo: alarm(int sec), abort( ) acontecimentos detectados pelos dispositivos hardware: FPU- divisão por zero; MMU- endereço inválido acontecimentos detectados pelo SO: terminação de um processo chamada ao sistema por um processo: kill( int pid, int sig ) --- ENVIAR sinal

Tratamento de sinais (recepção) SO processo entrega do sinal x interrompe o programa executa o handler(x) O handler é definido pela chamada ao SO, versão mais simples: typedef void (*sighandler_t)(int); sighandler_t signal(int sig, sighandler_t handler);

Tratamento de sinais (recepção) A ideia do handler é permitir alguma reacção no destino: p.ex. alterar flags; mudar contadores; etc. se é necessária mais informação, o programa deve depois usar um mecanismo de comunicação, para a obter "Handlers" especiais: SIG_IGN: ignorar sinal (nem todos os sinais podem ser ignorados) SIG_DFL: repor o tratamento implícito (default) oferecido pelo SO

Tratamento default (pré-definido) Para a maior parte dos sinais, o tratamento prédefinido (default) no SO, é terminar anormalmente o processo ex: os sinais para situações anómalas: (ver o manual) SIGFPE erro detectado pela FPU SIGSEGV erro detectado pela MMU SIGILL erro detectado pelo CPU SIGINT pedido de interrupção (p.ex. ^C no terminal) SIGKILL terminação forçada (não pode ser mudado!) Para outros o tratamento pré-definido é ignorar ex: SIGCHLD um processo filho terminou

Terminação do processo por um sinal É como se invocasse _exit() O SO passa um indicador do estado de terminação do filho para o pai no pai este pode ser obtido assim: wait( &status ); if ( WIFSIGNALED(status) ) printf("o filho terminou com o sinal %d\n", WTERMSIG(status) ); Se a terminação por um sinal for de um erro, é gerado um core dump: ficheiro com a imagem binária do mapa de memória do processo

Exemplo: tratar SIGCHLD Quando um processo termina, o seu pai recebe SIGCHLD. Tratamento no pai: void tratafilho(int sig) { wait(null); } int main( ) { signal(sigchld, tratafilho); (não funciona da mesma maneira em todas as versões UNIX)

Exemplo: tratar o SIGINT Pode ser gerado pelo terminal, p.ex. com tecla CONTROL-C void func_int(int sig) { /* trata sinal */ } main() {... signal(sigint, func_int); puts("func_int instalada p/ SIGINT\n");... }

Funcionamento dos sinais Os detalhes do funcionamento dos sinais têm mudado com as versões do sistema o handler é mantido após entregue cada sinal ou não? podem-se perder sinais enquanto se tratam outros interrompem o primeiro ou são guardados? os sinais interrompem a execução das chamadas ao sistema que bloqueiam o processo invocador? Foi definida uma norma com uma nova interface: sigaction esta permite definir o comportamento pretendido os sinais podem incluir mais informação

Tratamento de sinais (recepção) SO processo entrega do sinal x interrompe o programa executa o handler(x) O handler é definido pela chamada ao SO: int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); struct sigaction { void (*sa_handler)(int); -- acção a efectuar sigset_t sa_mask; -- + sinais a bloquear durante tratamento int sa_flags; -- comportamento após sinal void (*sa_sigaction)(int, siginfo_t *, void *); 11/19/2009 } FSO

Fiabilidade dos sinais no Unix Primeiras versões dos sinais Unix (anteriores a 4.2 BSD e SVR3) não eram confiáveis: Por cada sinal de um certo tipo entregue a um processo, a acção de tratamento passava a ser a pré-definida pelo SO era preciso 're-instalar' o handler de cada vez que ocorria um sinal desse tipo. ocorriam erros dependentes do tempo race-conditions (corridas)

Fiabilidade dos sinais no Unix (2) Versões modernas do Unix e a norma POSIX (sigaction): o handler de um sinal mantém-se definido até que o programa o mude pode-se bloquear/mascarar a entrega de sinais (pelo seu tipo), p.ex.: durante zonas críticas do programa, durante a execução dos handlers Mas a programação com sinais Unix continua a ser muito complexa e dependente das versões do sistema

Outra dificuldade Na maioria das realizações: se ocorrerem dois ou mais sinais de um mesmo tipo, sucessivamente, antes de o SO entregar o primeiro deles, então: não há garantia alguma de que todos os sinais sejam entregues. Não é garantido pela norma POSIX: Permite que seja entregue 1 ou mais vezes

Sinais durante chamadas ao SO O que acontece quando é gerado um sinal destinado a um processo, que invocou uma chamada ao SO e ainda não retornou ao programa utilizador? em geral, o sinal só é entregue no fim, isto é, logo que se dá o retorno ao processo mas se a chamada ao SO bloquear? read/write em pipe, wait o comportamento é diferente! Porquê?

Sinais durante chamadas bloqueadas 1. tratamento: o processo, ainda que bloqueado, é "interrompido" e a acção definida para o tratamento do sinal é efectuada; 2. retorno: em vez de retornar ao estado bloqueado, no interior da chamada onde estava, esta pode ser abortada: retorna com erro (-1), e errno afectada a EINTR, que indica que foi interrompida por um sinal.

Sinais durante chamadas ao SO (3) 1. O tratamento após a interrupção da chamada ao SO pode ser: repetir a chamada, voltando potencialmente a bloquear-se, ou prosseguir a execução deixando a decisão de qual acção a tomar à responsabilidade do programa (definida por sigaction()).

Exemplo: aguardar um intervalo de tempo A função sleep(t) bloqueia o processo até que decorra o intervalo T segundos. Se quisermos que o processo seja avisado de que decorreu um certo intervalo de tempo, mas sem ter de ficar bloqueado à espera? recorre-se a um sinal: SIGALRM

Exemplo de sinal de alarme Chamada ao SO: int alarm(int nseg) gera um sinal de tipo SIGALRM, que é entregue ao próprio processo, após decorridos nseg segundos (logo que o SO lho entregue) devolve o número de segundos que faltam até algum alarme ocorrer ou 0 se nenhum alarme alarm(0): desliga o alarme

Exemplo de sinal de alarme (2) O processo é notificado da ocorrência do alarme: se o programa definiu um handler, esse é invocado, e depois continua isto permite invocar acções periodicamente permite realizar TIME-OUTs: pode interromper algumas chamadas ao sistema, por exemplo: se o processo estava bloqueado num read de um pipe vazio, a entrega do sinal de alarme permite desbloqueá-lo.

Exemplo: meusleep Como obter o efeito do sleep? void alarmhandler(int signo) { return; } void meu_sleep( int s ) { signal(sigalrm, alarmhandler); alarm(s); pause(); signal(sigalrm, SIG_IGN); }

Exemplo: read com time-out Assumindo que o handler está definido: alarm(5); n = read( 0, buff, SZ ); if ( n == -1 && errno == EINTR ) /* houve time-out */ else alarm(0);

fork/exec e os sinais Após exec(): todos os sinais que tiverem um handler definido pelo programa, passam à acção pré-definida pelo SO; todos os outros sinais ficam com a mesma acção antes definida. Após fork(): o filho herda as definições dos sinais do pai; mas não recebe um SIGALRM que o pai tenha pedido

SIGX Outro problema Se não há controlo sobre quando um sinal ocorre, podemos ter problemas. Exemplo: v=n; v=v+1; n=v; handlersigx() { n=n-1;} Este é um exemplo no mesmo processo, devido a um sinal. Este tipo de problemas pode ocorrer sempre que há acções concorrentes partilhando recursos.

Signal sets Do tipo sigset_t representa cada sinal por um bit Funções sigemptyset -- tudo a 0 sigfillset tudo a 1 sigaddset um sinal específico a 1 sigdelset - um sinal específico a 0 int sigemptyset(sigset_t *set), int sigaddset(sigset_t *set, int signo);

int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); act as acções a efectuar oact os valores correntes struct sigaction{ void (*sa_handler)(int); -- a acção a efectuar sigset_t sa_mask; -- sinais a bloquear durante o tratamento int sa_flags; -- opções para tratar void (*sa_sigaction)(int, siginfo_t *, void *); -- apontador para o handler }

sa_handler: SIG_DFL acção by default SIG_IGN ignorar endereço de um handler sa_mask: especifica um conjunto de sinais a bloquear durante a execução do handler, além do tipo do sinal a tratar sa_flags: modifica o comportamento após o tratamento: -- sa_flags = SA_RESETHAND -- reset SIG_DFL -- sa_flags = SA_SIGINFO após a recepção do sinal a estrutura siginfor_t tem informação adicional -- sa_falgs = SA_RESTART repete a execução de uma chamada ao SO interrompida por um sinal, sem dar erro sa_sigaction: -- outra opção para especificar o handler

Bloqueio de sinais int sigprocmask(int how, const sigset_t sigset_t *set, *oset); how: SIG_SETMASK bloqueia os sinais de set SIG_UNBLOCK desbloqueia SIG_BLOCK junta os sinais de set à máscara corrente oset: obtém a máscara corrente de sinais bloqueados

int kill(pid_t pid, int sig); O emissor deve ter o mesmo userid do receptor, excepto no caso do superuser pid = 0 envia a todos processos do mesmo grupo do emissor pid > 0 envia ao processo de pid dado pid = -1 envia aos processos com o mesmo userid do emissor se for o superuser: envia a todos os processos pid <0 mas <> -1: envia aos processos do grupo cujo gid é igual ao pid

int raise(int sig); Envia um sinal ao próprio unsigned int alarm(unsigned int secs); Envia sinal SIGALRM ao próprio, ao fim de secs segundos é desligado com alarm(0); int pause(void); Aguarda, bloqueado, qualquer tipo de sinal Se é para tratar: devolve -1 e errno = EINTR