Manipulação de processos Luiz Affonso Guedes 1 Ivanovitch Silva 1 affonso@dca.ufrn.br ivan@dca.ufrn.br 1 Universidade Federal do Rio Grande do Norte 17 de setembro de 2009 Processos DCA0109 1 / 18
Sumário 1 Gerenciamento de processos Propriedades do processo Funções getpid e getppid Exemplo 01 2 Criação de processos Função fork Exemplo 02 Exemplo 03 Desafio 1 3 Sincronização de processos Função wait Exemplo 04 4 Chamando funções do SO Função system Exemplo 05 Processos DCA0109 2 / 18
Sumário 1 Gerenciamento de processos Propriedades do processo Funções getpid e getppid Exemplo 01 2 Criação de processos Função fork Exemplo 02 Exemplo 03 Desafio 1 3 Sincronização de processos Função wait Exemplo 04 4 Chamando funções do SO Função system Exemplo 05 Processos DCA0109 3 / 18
Propriedades do processo Informações sobre os processos Quando um programa está sendo executado, ele é considerado um processo e ocupa um espaço dentro de gerenciador de processos. Precisamos encontrar uma maneira de identificar o processo. Process Identification - PID SO garante que enquanto o processo estiver ativo na máquina o PID será único Parent Process Identification - PPID Processos DCA0109 3 / 18
Funções getpid e getppid Funções getpid e getppid Sintaxe: pid t getpid (void) Descrição: Retorna o PID do processo. Sintaxe: pid t getppid (void) Descrição: Retorna o PID do criador do processo. Processos DCA0109 4 / 18
Exemplo 01 Exemplo 01 - Funções getpid() e getppid() Download 1 //Compilar: g++ -o nomeexecutavel nomedoarquivo.cpp 2 //Executar:./nomeExecutavel 3 4 #include <stdio. h> 5 #include <s t d l i b. h> 6 #include <unistd. h> 7 8 int main (int argc, char argv [ ] ) { 9 //Identificador do criador do processo (pai) 10 p i d t i d P a i ; 11 //Identificador do processo 12 p i d t idprocesso ; 13 //Obtendo o identificador do pai 14 i d P a i = getppid ( ) ; 15 //Obtendo o identificador do processo 16 idprocesso = getpid ( ) ; 17 printf ( PID :\ t %d \nppid:\ t %d \n, idprocesso, idpai ) ; 18 exit ( 0 ) ; 19 } Processos DCA0109 5 / 18
Sumário 1 Gerenciamento de processos Propriedades do processo Funções getpid e getppid Exemplo 01 2 Criação de processos Função fork Exemplo 02 Exemplo 03 Desafio 1 3 Sincronização de processos Função wait Exemplo 04 4 Chamando funções do SO Função system Exemplo 05 Processos DCA0109 6 / 18
Criação de processos no sistema operacional Com exceção do processo init, que é criado no boot da máquina, todos os demais processos são criados através da função interna do kernel chamada fork A função fork duplica o processo atual Processo que chamou a função fork é chamado de processo pai O novo processo criado pela função fork é chamado de processo filho Processos DCA0109 6 / 18
Fork - visão geral Processo pai fork() Processo pai Processo filho Processos DCA0109 7 / 18
Função fork Função fork Sintaxe: pid t fork (void) Retorno: 0 - o processo filho está sendo executado >0 - o processo pai está sendo executado. O valor retornado representa o PID do processo filho -1 - erro Processos DCA0109 8 / 18
Exemplo 02 Exemplo 02 - Função fork Download 1 //Compilar: g++ -o nomeexecutavel nomedoarquivo.cpp 2 //Executar:./nomeExecutavel#include <sys/types.h> 3 4 int main (){ 5 // Identificador do processo 6 p i d t idprocesso ; 7 printf ( I n i c i a n d o o programa\n ) ; 8 // Criando o processo 9 idprocesso = fork ( ) ; 10 switch ( idprocesso ){ 11 case 1: // erro na abertura do processo filho 12 exit ( 1 ) ; 13 case 0: // retorno de fork para processo filho 14 printf ( Sou o processo f i l h o ID : %d, pai ID : %d\n, getpid ( ), getppid ( ) ) ; 15 break ; 16 default : 17 printf ( Sou o processo pai com ID : %d, pai ID : %d, f i l h o ID : %d\n, 18 getpid ( ), getppid ( ), idprocesso ) ; 19 break ; 20 } 21 exit ( 0 ) ; 22 } Processos DCA0109 9 / 18
Exemplo 03 Exemplo 03 - Função fork Download 1 //Compilar: g++ -o nomeexecutavel nomedoarquivo.cpp 2 //Executar:./nomeExecutavel 3... 4 idprocesso = fork ( ) ; 5 switch ( idprocesso ){ 6 case 1: // erro na abertura do processo filho 7 exit ( 1 ) ; 8 case 0: // retorno de fork para processo filho 9 for ( int i =0; i <10; i ++){ 10 printf ( Sou o processo f i l h o ID : %d\n,getpid ( ) ) ; 11 sleep ( 5 ) ; 12 } 13 break ; 14 default : // retorno de fork para processo pai 15 for ( int i =0; i <10; i ++){ 16 printf ( Sou o processo pai ID : %d\n,getpid ( ) ) ; 17 sleep ( 5 ) ; 18 } 19 break ; 20 } 21 printf ( O processo com ID : %d f i n a l i z o u!!!! \ n,getpid ( ) ) ; 22 exit ( 0 ) ; 23... Processos DCA0109 10 / 18
Exemplo 03 Exemplo 03 - Função fork Analisar o exemplo 03 1 Mudar o tempo de sleep do processo pai para 2s 2 Investigar os processos através do comando ps -aux 3 Finalizar o processo pai (kill -9 pidpai). Verificar o comando ps -aux. 4 Fazer o mesmo procedimento do passo 3 para o processo filho. Processos DCA0109 11 / 18
Desafio 1 Estrutura do problema Pai fork() Pai Filho1 fork() fork() Pai Filho2 Filho1 Neto1 fork() Filho2 Neto2 Processos DCA0109 12 / 18
Desafio 1 Descrição do problema 1 ano corresponde a 1 segundo. O pai morre aos 60 anos. O pai tem um filho aos 14 anos. O pai tem outro filho aos 16 anos. O pai é avô aos 26 anos (primeiro filho). O pai é avô novamente (segundo filho) aos 30 anos. O primeiro e o segundo filhos morrem ambos aos 30 anos. O primeiro neto morre aos 12 anos enquanto que o segundo morre aos 18 anos. Processos DCA0109 13 / 18
Sumário 1 Gerenciamento de processos Propriedades do processo Funções getpid e getppid Exemplo 01 2 Criação de processos Função fork Exemplo 02 Exemplo 03 Desafio 1 3 Sincronização de processos Função wait Exemplo 04 4 Chamando funções do SO Função system Exemplo 05 Processos DCA0109 14 / 18
Função wait Esperando um término de um processo O processo pai pode esperar o término de um processo filho através da chamada da função wait A função wait irá retornar o status de retorno de qualquer processo filho que termine. O processo que chamar a função wait terá um desses seguintes comportamentos: Bloquear sua execução até o término de algum processo filho Retornar imediatamente com o status de término de um processo filho caso o filho já tenha terminado Erro caso não se tenha nenhum processo filho rodando Processos DCA0109 14 / 18
Função wait Função wait Sintaxe: pid t wait (int *stat loc) Retorno: PID do processo que terminou Status que provocou o término do processo Macros auxiliares: WIFEXITED(stat loc) - retorna verdadeiro caso o processo filho tenha terminado normalmente WIFSIGNALED(stat loc) - retorna verdadeiro caso o processo filho tenha terminado através do recebimento de um sinal WEXITSTATUS(stat loc) - se finalizou normalmente, retorna o código de finalização WTERMSIG(stat loc) - se finalizou por causa de um sinal, retorna o código do sinal Processos DCA0109 15 / 18
Exemplo 04 Exemplo 04 - Função wait Download 1... 2 //Varaiaveis usadas para modelar o problema 3 int idprocesso ; 4 int statusretorno ; 5 int cont = 0; 6 //Criando o processo 7 idprocesso = fork ( ) ; 8 if ( idprocesso < 0) exit ( errno ) ; 9 if ( idprocesso!= 0){ //Processo pai 10 //Espera bloqueante pela morte do filho 11 wait (& statusretorno ) ; 12 if (WIFEXITED ( statusretorno ) ) 13 printf ( Finalizou normalmente : %d\n, WEXITSTATUS ( statusretorno ) ) ; 14 else if (WIFSIGNALED ( statusretorno ) ) 15 printf ( Cancelado por um sinal : %d\n, WTERMSIG ( statusretorno ) ) ; 16 } 17 if ( idprocesso == 0){ //Processo filho 18 while ( cont < 10){ 19 printf ( Processo f i l h o : %d\n, getpid ( ) ) ; 20 sleep ( 2 ) ; 21 cont ++; 22 } 23 exit ( 1 ) ; 24 } 25 exit ( 0 ) ; Processos DCA0109 16 / 18
Sumário 1 Gerenciamento de processos Propriedades do processo Funções getpid e getppid Exemplo 01 2 Criação de processos Função fork Exemplo 02 Exemplo 03 Desafio 1 3 Sincronização de processos Função wait Exemplo 04 4 Chamando funções do SO Função system Exemplo 05 Processos DCA0109 17 / 18
Função system Chamando funções do SO dentro do programa Sintaxe: int sytem (const char *command) Retorno: 0 - o comando foi executado com sucesso -1 - se não foi possível executar o fork código - se não foi possível executar o exec Processos DCA0109 17 / 18
Exemplo 05 Exemplo 05 - Função system Download 1 //Compilar: g++ -o nomeexecutavel nomedoarquivo.cpp 2 //Executar:./nomeExecutavel 3 4 #include <s t d l i b. h> 5 #include <stdio. h> 6 7 int main (){ 8 printf ( I n i c i o \n ) ; 9 printf ( F i n a l i z o u com o seguinte codigo : %d\n,system ( l s l a ) ) ; 10 exit ( 0 ) ; 11 } Processos DCA0109 18 / 18