técnicas avançadas de programação file1: envia um sinal para todos os processos cujo dono seja...

27
Sumário Técnicas Avançadas de Programação Prof. João Marcos M. da Silva Departamento de Engenharia de Telecomunicações Escola de Engenharia Universidade Federal Fluminense Agosto de 2011 Prof. João Marcos Meirelles da Silva Aula 03 — pg. 1/23

Upload: others

Post on 15-Oct-2019

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Sumário

Técnicas Avançadas de Programação

Prof. João Marcos M. da Silva

Departamento de Engenharia de TelecomunicaçõesEscola de Engenharia

Universidade Federal Fluminense

Agosto de 2011

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 1/23

Page 2: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Sumário

Sumário

1 Processos Concorrentes II

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 2/23

Page 3: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Sumário

1 Processos Concorrentes IISinaisMais PrimitivasControle de ProcessosExercícios:

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 3/23

Page 4: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Sinais

Cada processo no Linux fica à escuta de sinais. Estes sinais sãoutilizados pelo Kernel, por outros processos ou pelo usuário paraavisar um determinado processo sobre algum evento em particular.Os sinais são, a grosso modo, interrupções de software, assi comexistem as interrupções de hardware.

Quando um sinal é enviado a um processo, ele toma umadeterminada ação dependendo do valor que este sinal carrega.

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 4/23

Page 5: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Sinais

Observação

É importante saber que um sinal é normalmente tratado de duasmaneiras diferentes:

1 O processo recebe um sinal e faz o seu tratamentoexecutando alguma ação;

2 O processo recebe um sinal e o ignora.

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 5/23

Page 6: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Sumário

1 Processos Concorrentes IISinaisMais PrimitivasControle de ProcessosExercícios:

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 6/23

Page 7: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

A primitiva KILL

A primitiva kill permite que qualquer sinal possa ser enviado paraum determinado processos ou grupo de processos.

#include <sys/types.h>#include <signal.h>

int kill(pid_t, int sig);

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 7/23

Page 8: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

A primitiva KILL

A primitiva kill recebe dois parâmetros, a saber:

1 sig: inteiro representando o número do sinal a ser enviado.2 pid: variável do tipo pid_t representando o PID de um

processo. Também pode aceitar um valor pré-determinado:< −1: Envia um sinal para todos os processos cujo valor GIDseja igual ao valor absoluto do valor passado;−1: Envia um sinal para todos os processos, com exceção doinit;0: Envia um sinal para todos os processos que tenham omesmo GID do processo emissor;1: Envia um sinal para todos os processos cujo dono seja igualao dono do processo emissor. Se ele pertencer ao superusuário,o sinal é enviado para todos os processos de usuários;> 1: Envia um sinal para o processo identificado pelo númneroPID informnado.

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 8/23

Page 9: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Exemplo 1: kill_filho.c

#include <stdio.h>#include <unistd.h>#include <signal.h>#include <wait.h>

int main(){int pid, status;

printf("Meu número de processo é %d.Vou criar um processo filho.\",getpid());

pid = fork();

if(pid == 0){ /* Processo filho */printf("\tProcesso filho criado com PID = %d.\n", getpid());printf("\tVou ficar executando indefinidamente.\n");for(;;);

}else /* Processo Pai */{sleep(5);

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 8/23

Page 10: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

printf("Vou enviar um sinal SIGKILL para meu filho.\n");kill(pid,SIGKILL);wait(&status);printf("O processo filho terminou com exit = %d.\n", WEXITSTATUS(status));

}exit(0);

}

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 9/23

Page 11: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

A primitiva SIGNAL

A chamada de sistema signal é responsável pelo tratamento dossinais recebidos por um processo. Esta função recebe doisparâmetros: o número do sinal signum e um manipulador handler.#include <signal.h>

typedef void (*sighandler_t)(int)

sighandler_t signal(int signum, sighandler_t handler);

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 9/23

Page 12: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

A primitiva SIGNAL

O valor signum é numérico e representado pelo número do sinal aser tratado. Os sinais SIGKILL(9) e SIGSTOP(19) não podem sertratados por esta função. (Por quê?)

Valores do handlerSIG_IGN Este valor indica que o sinal recebido deve ser

simplesmente ignorado;SIG_DFL Este valor indica que o processo deve tomar as ações

definidas pelo sistema para aquele determinado sinal;NomeFunção O manipulador poderá assumir um nome de uma

função declarada no programa.

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 10/23

Page 13: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Exemplo 2: signal.c

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>#include <wait.h>

void meusinal(int sig) /* Tratamento sobre o sinal */{printf("\tRecebi o sinal %d.\n", sig);printf("\tTerminando...\n");sleep(2);exit(5);

}

int main(){int pid, status;

printf("Meu numero de processo eh %d. Vou criar um processo filho.\n",getpid());

pid = fork();

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 10/23

Page 14: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

if(pid==0) /* Processo filho */{signal(10,meusinal);printf("\tProceso filho criado com o PID numero %d.\n", getpid());printf("\tVou ficar executando indefinidamente.\n");for(;;){printf("\tEsperando o sinal...\n");sleep(1);

}}else /* Processo pai */{sleep(5);printf("Vou enviar um signal 10 para meu filho.\n");kill(pid, 10);wait(&status);printf("O processo filho terminou com o exit = %d.\n", WEXITSTATUS(status));

}exit(0);}

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 11/23

Page 15: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

A primitiva ALARM

A primitiva alarm envia o sinal SIGALARM(14) para o próprioprocesso após um intervalo de tempo definido em segundos.O tratamento deste sinal deve estar previsto no programa. Estafunção está declarada em unistd.h.

#include <unistd.h>

unsigned int alarm(unsigned int secs)

Ela recebe como parâmetro o tempo em segundos que serádecrescido até zero e disparar o sinal.

Exemplo: alarm.c

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 11/23

Page 16: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

A primitiva PAUSE

A primitiva pause faz com que o processo ou rotina que a chamoufique suspenso até a a chegada de algum sinal. Classicamente, elaé utilizada em conjunto com a função alarm. Esta função estádeclarada em unistd.h.

#include <unistd.h>

int pause(void)

Exemplo: pause.c

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 12/23

Page 17: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Observações

alarm() e signal()

As funções alarm() e signal() podem ser úteis para transmitir aousuário o progresso de uma aplicação que realiza longos cálculosmatemáticos ou outras atividades demoradas. Um alarme pode serconfigurado para chamar uma função dentro de um intervalopequeno de tempo para atualizar a tela para o usuário.

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 13/23

Page 18: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Sumário

1 Processos Concorrentes IISinaisMais PrimitivasControle de ProcessosExercícios:

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 14/23

Page 19: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Controle de Processos

O Linux disponibiliza alguns comandos que nos auxiliam acontrolar os processos. São eles:

bgfgkillkillalljobsps

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 15/23

Page 20: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Comando bg

O comando bg coloca um processo para ser executado em segundoplano (ou background). Colocar o sinal “&” depois da chamadado processo tem o mesmo efeito. Se um processo estiver emexecução no primeiro plano (ou foreground), pode-se suspendersua execução temporariamente pressionando as teclas ctrl-z (sinalTSTP(18)).

Exemplo:

$ find / -name mss > lista_msg.txtCTRL-Z[1]+ stopped find / -name mss > lista_msg.txt$ bgfind / -name mss > lista_msg.txt

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 16/23

Page 21: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Comando fg

O comando fg faz exatamente o oposto do comando bg,colocando o processo em primeiro plano.

Uso: fg [número da tarefa]

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 17/23

Page 22: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Comando kill

O comando kill envia sinais para os processos. Ele é usadogeralmente para terminar a execução de processos identificadospelo seu PID. Se nenhum sinal específico for passado comoparâmetro, o kill irá enviar o sinal TERM(15) para terminar oprocesso de forma elegante.

Uso: kill [-sinal] PID

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 18/23

Page 23: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Comando killall

O comando killall envia sinais para os processos e recebe comoparâmetro não o PID do processo, mas seu nome. Ele é usadogeralmente para terminar a execução de processos que possuemdiversos processos filhos executando concorrentemente. Se nenhumsinal específico for passado como parâmetro, o killall irá enviar osinal TERM(15) para terminar o processo de forma elegante.

Uso: killall [-sinal] Nome do processo

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 19/23

Page 24: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Comando jobs

O comando jobs lista os processos do usuário que estão emexecução em segundo plano.

Uso: jobs [opções][Número da tarefa]

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 20/23

Page 25: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Comando ps

O comando ps (process status) apresenta os processos que estãorodando no sistema e diversas informações sobre estes, conforme aopção passada como parâmetro.

Uso: ps [-opções][Nome do Processo]

Exemplo: ps -aux

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 21/23

Page 26: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Sumário

1 Processos Concorrentes IISinaisMais PrimitivasControle de ProcessosExercícios:

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 22/23

Page 27: Técnicas Avançadas de Programação file1: Envia um sinal para todos os processos cujo dono seja igual ao dono do processo emissor. Se ele pertencer ao superusuário, o sinal é

Processos Concorrentes II

SinaisMais PrimitivasControle de ProcessosExercícios:

Exercício 3:

Pesquise o conteúdo do arquivo /usr/include/signal.h.

O que você vê ?

⇒ Dica: utilize o comando “less” em um terminal.

Prof. João Marcos Meirelles da Silva Aula 03 — pg. 23/23