Você está na página 1de 4

Sinais

Conteudo

Sinais

Sinais
Tipos de sinais
Comando kill

Chamadas ao sistema e funcoes


signal
kill
raise
pause
alarm
sleep

Exerccios

Referencias

Primeira aula
Jose Pedro Oliveira
(jpo@di.uminho.pt)
Grupo de Sistemas Distribudos

Departamento de Informatica
Escola de Engenharia
Universidade do Minho

Sistemas Operativos I
2006-2007

Jose Pedro Oliveira

Jose Pedro Oliveira

Sinais

Sinais

Sinais

Sinais

Introducao

Introducao

Sinais
parte integrante de um sistema UNIX/POSIX. Sinais
Sinais sao
utilizados para diversos fins, tais como:
sao
(divisao
por zero, etc)
tratamento de excepcoes
de ocorrencia

de eventos assncronos (disparo


notificacao
de uma tarefa de E/S, etc.)
de um timer, finalizacao
de processos sob circunstancias

finalizacao
anormais
de multitasking
emulacao
entre processos
comunicacao

Jose Pedro Oliveira

Conceitos

Um sinal POSIX e o equivalente software de uma interrupcao

A recepcao
de um sinal
ou da ocorrencia
de uma excepcao.
notifica o processo de que algo importante aconteceu e de que

e necessaria
a sua atencao.
Conceitos
um nome
cada sinal tem
os nomes dos sinais comecam pelos caracteres SIG
todos definidos por constantes inteiras
estes nomes sao
positivas (numero
do sinal)

o numero
nenhum sinal tem
0

Jose Pedro Oliveira

Sinais

Sinais

Sinais

associadas a um sinal
Accoes

Sinais
Tipos de sinais

Tipos de sinais (1/4)

Sumario

Um sinal ocorre em momentos aparentemente aleatorios


para o processo
pode simplesmente testar o valor de
Um processo nao

uma variavel
para determinar se um sinal ocorreu; em vez
disso, o processo deve especificar ao kernel o que fazer
quando um sinal ocorrer.

de erros
Deteccao
SIGBUS - access to undefined portion of a memory object
(A)
SIGFPE - erroneous arithmetic operation (A)
SIGILL - illegal instruction (A)
SIGPIPE - write on a pipe with no reader (T)

associadas a um sinal
Accoes
1
2

SIGSEGV - invalid memory reference (A)


SIGSYS - bad system call (A)

ignorar o sinal (SIG IGN)


da execucao
de
apanhar o sinal (catch the signal) atraves
uma rotina de atendimento
por omissao
(SIG DFL); a accao
por omissao
para
accao
a grande maioria dos sinais e terminar o processo
Jose Pedro Oliveira
Sinais

SIGXCPU - CPU-time limit exceeded (A)


SIGXFSZ - file-size limit exceeded (A)

Jose Pedro Oliveira

Sinais
Tipos de sinais

Tipos de sinais (2/4)

Sinais

Sinais
Tipos de sinais

Tipos de sinais (3/4)

Gerados por aplicacoes/utilizadores


Controlo de processos

SIGABRT - call to abort (A)

SIGCHLD - child process terminated or expired (I)

SIGHUP - hangup (T)


SIGINT - interrupt (from keyboard) (T)
SIGKILL - kill; synthetic only (T)
SIGQUIT - quit (from keyboard) (A)
SIGTERM - termination; synthetic only (T)
SIGUSR1 - user signal 1; synthetic only (T)

SIGCONT - continue executing (from keyboard) (C)


SIGSTOP - stop executing; synthetic only (S)
SIGTSTP - terminal stop executing (from keyboard) (S)
SIGTTIN - background process attempting read (S)
SIGTTOU - background process attempting write (S)

SIGUSR2 - user signal 2; synthetic only (T)

Jose Pedro Oliveira

Sinais

Jose Pedro Oliveira

Sinais

Sinais

Tipos de sinais

Sinais

Tipos de sinais

por omissao

Sinais: accoes

Tipos de sinais (4/4)

por omissao

Accoes

Timer
SIGALRM - alarm clock expired (T)

I - o sinal e ignorado
T - o processo e terminado

SIGVYALRM - virtual timer expired (T)

adicionais tais
A - o mesmo que T mas com accoes
de ficheiros core
como a geracao

SIGPROF - profiling timer expired (T)

S - stop

Miscellaneous
SIGPOLL - pollable event (T)

C - continuar depois de um stop

SIGTRAP - trace/breakpoint trap (A)


SIGURG - out-of-band data available at socket (I)

Jose Pedro Oliveira


Sinais

Jose Pedro Oliveira

Sinais
Tipos de sinais

Sinais

por omissao

Linux: kernel 2.4 e accoes

Exerccio
2.4 (linux-2.4.33.3.tar.bz2)
Descarregue o ultimo
kernel versao

por omissao
dos sinais
e faca o levantamento das accoes
da analise

atraves
dos ficheiros signal.c.
linux-2.4.33.3/kernel/signal.c
linux-2.4.33.3/arch/i386/kernel/signal.c

Sinais

Sinais
Comando kill

Comando kill

por omissao

Linux: sinais disponveis e accoes


$ man 7 signal

Jose Pedro Oliveira

de ficheiros core
Permitir a geracao
$ ulimit -c unlimited

Comando kill
O comando kill permite enviar um sinal para um processo ou
um grupo de processos. Se nenhum sinal for especificado, o
O sinal TERM mata todos
sinal TERM e enviado por omissao.
o interceptarem. Nalguns casos pode
os processos que nao

ser necessario
enviar o sinal KILL (9), dado que este sinal nao
pode ser interceptado.
Synopsis
kill [opc

oes]

[pid] ...

Jose Pedro Oliveira

Sinais
Comando kill

Sinais

Comando kill: listar sinais

Sinais
Comando kill

Comando kill: sinais

Alguns sinais
$ kill -l
1)
5)
9)
13)
18)
22)
26)
30)
36)
...
60)
64)

SIGHUP (1) - Hangup.

SIGHUP
SIGTRAP
SIGKILL
SIGPIPE
SIGCONT
SIGTTOU
SIGVTALRM
SIGPWR
SIGRTMIN+2

2)
6)
10)
14)
19)
23)
27)
31)
37)

SIGINT
SIGABRT
SIGUSR1
SIGALRM
SIGSTOP
SIGURG
SIGPROF
SIGSYS
SIGRTMIN+3

SIGRTMAX-4
SIGRTMAX

61) SIGRTMAX-3

3)
7)
11)
15)
20)
24)
28)
34)
38)

SIGQUIT
SIGBUS
SIGSEGV
SIGTERM
SIGTSTP
SIGXCPU
SIGWINCH
SIGRTMIN
SIGRTMIN+4

62) SIGRTMAX-2

4)
8)
12)
17)
21)
25)
29)
35)
39)

SIGILL
SIGFPE
SIGUSR2
SIGCHLD
SIGTTIN
SIGXFSZ
SIGIO
SIGRTMIN+1
SIGRTMIN+5

63) SIGRTMAX-1

SIGINT (2) - Interrupt.

(gerado pela sequencia


de teclas CTRL+C)
SIGQUIT (3) - Quit.

(gerado pela sequencia


de teclas CTRL+\)
SIGKILL (9) - Kill, unblockable.
pode ser interceptado pelo
Este sinal nao
processo.
SIGTERM (15) - Termination.
pelo comando kill.
Sinal enviado por omissao

Jose Pedro Oliveira


Sinais

Jose Pedro Oliveira

Sinais

Comando kill: exemplos

Conteudo

Sinais
Tipos de sinais
Comando kill

Chamadas ao sistema e funcoes


signal
kill
raise
pause
alarm
sleep

Exerccios

Referencias

$ kill pid
Envia o sinal TERM para o processo pid. O processo ao

receber este sinal devera terminar a sua execucao.


$ kill -9 pid
lhe dando
O sistema operativo termina o processo pid, nao

qualquer hipotese
de executar codigo
de limpeza.
$ kill -INT pid
O sinal INT e enviado para o processo pid.

Jose Pedro Oliveira

Sinais

Chamadas ao sistema e funcoes

Comando kill

Sinais

Jose Pedro Oliveira

Sinais


Chamadas ao sistema e funcoes

Synopsis
#include <signal.h>
typedef void (*sighandler t)(int);
sighandler t signal(int signum, sighandler t handler);

Handlers pre-definidos
SIG IGN - ignorar o sinal
por omissao

SIG DFL - accao


Jose Pedro Oliveira

Exemplo 1 - signal.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

/ I n c l u i r : stdio .h , s t d l i b .h , signal . h /
void r o t i n a a t e n d i m e n t o ( i n t s i g )
{
...
}
i n t main ( void )
{
...
i f ( s i g n a l ( SIGINT , r o t i n a a t e n d i m e n t o ) == SIG ERR ) {
p e r r o r ( s i g n a l \n ) ;
e x i t ( SIGINT ) ;
}
...
}

Jose Pedro Oliveira

Sinais

Chamadas ao sistema e funcoes

signal

Sinais
signal

signal - mesma rotina de atendimento para varios


sinais

signal - ignorar sinal

Exemplo 3 - mesma rotina de atendimento

Exemplo 2 - ignorar.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

signal

signal - registar rotina de atendimento

Sumario
Permite instalar uma nova rotina de atendimento do sinal
signum.

Chamadas ao sistema e funcoes

Chamadas ao sistema e funcoes

signal

Chamada ao sistema: signal

/ I n c l u i r : stdio . h , s t d l i b . h , unistd . h , signal . h /


i n t main ( void )
{
int i = 0;
i f ( s i g n a l ( SIGINT , SIG IGN ) == SIG ERR ) {
perror ( signal ) ;
e x i t ( SIGINT ) ;
}
p r i n t f ( CTRL+C ( SIGINT ) ou CTRL+\\ ( SIGQUIT ) \ n ) ;
while ( 1 ) {
p r i n t f ( %d\n , i + + ) ;
}
return 0;

sleep ( 3 ) ;

Jose Pedro Oliveira

Chamadas ao sistema e funcoes

i n t main ( void )
{
s i g n a l ( SIGINT , r o t i n a a t e n d i m e n t o ) ;
s i g n a l ( SIGUSR1 , r o t i n a a t e n d i m e n t o ) ;
...
return 0;
}

Jose Pedro Oliveira

Sinais

Chamadas ao sistema e funcoes

Sinais
kill

Chamada ao sistema: kill

Sumario
Permite enviar um sinal para um processo ou para um grupo
de processos.
Synopsis
#include <sys/types.h>
#include <unistd.h>
int kill(pid t pid, int sig);

Permissoes
O envio de sinais e permitido se:

Parametro
pid
> 0 - o sinal sig e enviado ao processo pid
== 0 - o sinal sig e enviado a todos os processos do
grupo ao qual pertence o processo corrente
== 1 - o sinal sig e enviado a todos os processos para
de o
os quais o processo corrente tem permissoes
do processo 1)
fazer (com a excepcao
< 1 - o sinal sig e enviado a todos os processos do
grupo -pid

Parametro
sig

a conta do processo emissor for privilegiada


a conta do processo emissor for igual a` conta do processo
alvo
Jose Pedro Oliveira

void r o t i n a a t e n d i m e n t o ( i n t s i n a l )
{
switch ( s i n a l ) {
case SIGINT :
...
break ;
case SIGUSR1 :
...
break ;
}
}

kill

Chamada ao sistema: kill

Chamadas ao sistema e funcoes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

e enviado mas o tratamento de erros


== 0 - o sinal nao
e efectuado
Jose Pedro Oliveira

Sinais

Chamadas ao sistema e funcoes

raise

raise
Funcao:

Sinais
pause

Chamada ao sistema: pause

Sumario
Envia um sinal para o processo corrente.

#include <signal.h>

Sumario
Coloca o processo corrente a dormir ate este receber um sinal
de uma rotina de
que o termine ou cause a invocacao
atendimento.

int raise(int sig);

Synopsis

Synopsis

#include <unistd.h>

Nota
raise(sig) e equivalente a:
A funcao
kill(getpid(), sig);

Jose Pedro Oliveira

Sinais

int pause(void);

Jose Pedro Oliveira

Sinais


Chamadas ao sistema e funcoes

Synopsis
#include <unistd.h>
unsigned int alarm(unsigned int seconds);

Notas
de alarm devolve o numero
A invocacao
de segundos que

ainda faltariam para completar o alarme pendente (zero se


houver nenhum alarme pendente).
nao
Se o argumento for zero, o alarme alarme pendente e

desactivado (caso aplicavel).


Jose Pedro Oliveira

alarm

Alarme periodico

Sumario
Programa a entrega de um sinal SIGALRM ao processo
corrente ao fim de n segundos.

Chamadas ao sistema e funcoes

Chamadas ao sistema e funcoes

alarm

Chamada ao sistema: alarm

Exemplo - alarme periodico.c


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

/ I n c l u i r : stdio . h , s t d l i b . h , unistd . h , signal . h /


void r o t i n a ( i n t s i g n o )
{
alarm ( 1 ) ;
/ p r i n t f ( 1 segundo\n ) ; /
}
i n t main ( void )
{
s i g n a l (SIGALRM, r o t i n a ) ;
alarm ( 1 ) ;
while ( 1 ) {
pause ( ) ;
}
return 0;
}
Jose Pedro Oliveira

Sinais
sleep

sleep
Funcao:

Sinais

Exerccios

Conteudo

Sumario
Coloca o processo corrente a dormir ate decorrerem os n
seja
segundos ou ate o processo receber um sinal que nao
ignorado.

Sinais
Tipos de sinais
Comando kill

Chamadas ao sistema e funcoes


signal
kill
raise
pause
alarm
sleep

Exerccios

Referencias

Synopsis
#include <unistd.h>
unsigned int sleep(unsigned int seconds);

Jose Pedro Oliveira

Jose Pedro Oliveira

Sinais

Exerccios

Exerccio

Exerccios

Enunciado
Pretende-se monitorizar (todos os minutos) o custo de
em funcao
de um tarifario

comunicacao
apresentado em baixo.
sao
assinalados atraves

O estabelecimento e o fim da ligacao


de SIGUSR1 e SIGUSR2 respectivamente. Apresente o
` primitivas de sinais do UNIX
programa monitor recorrendo as
S YSTEM V.

Duracao
t < 5min.
t 5min.

Jose Pedro Oliveira

Custo
5 cent./min.
4 cent./min.

Mini-interpretador de comandos
Impedir que o interpretador termine ao receber os sinais
SIGINT, SIGUSR1 e SIGUSR2.
Permitir que o interpretador termine correctamente ao
receber o sinal SIGTERM.
Criar um sistema de alerta de eventos que permita ter
mais do que um pedido pendente:
alarm list - listar alertas pendentes
alarm add nminutos mensagem - adicionar novo evento

Jose Pedro Oliveira

Sinais

Referencias

Referencias
Bibliografia

Sinais
Tipos de sinais
Comando kill

Advanced Programming in the UNIX Environment, 2nd ed.


W. Richard Steven, Stephen A. Rago

Chamadas ao sistema e funcoes


signal
kill
raise
pause
alarm
sleep

Exerccios

Referencias

Sinais

Referencias

Conteudo

Sinais

Exerccios

Captulo 10 - Signals
Advanced UNIX Programming, 2nd ed.
Marc J. Rochkind
Captulo 9 - Signals and Timers
Linux Programming by Example: The Fundamentals
Arnold Robbins
Captulo 10 - Signals
The Design of the Unix Operating System
Maurice J. Bach
7.2 - Signals
Captulo 7 - Seccao

Jose Pedro Oliveira

Sinais

Jose Pedro Oliveira

Sinais