Anda di halaman 1dari 4

Programas e Processos

Conteudo

Processos
Aula 1 - Chamadas ao sistema Jose Pedro Oliveira (jpo@di.uminho.pt)
Grupo de Sistemas Distribudos Departamento de Informatica Escola de Engenharia Universidade do Minho 1

Programas e Processos Chamadas ao sistema fork exit getpid, getppid wait, waitpid Referencias

Sistemas Operativos I 2006-2007

Jose Pedro Oliveira Programas e Processos

Processos

Jose Pedro Oliveira Chamadas ao sistema

Processos

Programas e Processos

Conteudo

Programa Um programa e um cheiro executavel que reside num directorio de um disco. Um programa e carregado para memoria e executado pelo kernel como resultado de uma das seis funcoes exec. Processo Uma instancia em execucao de um programa e designada por processo. Cada processo tem um identicador numerico unico designado por process ID. Este identicador e um numero inteiro nao negativo.
1

Programas e Processos Chamadas ao sistema fork exit getpid, getppid wait, waitpid Referencias

Jose Pedro Oliveira Chamadas ao sistema

Processos

Jose Pedro Oliveira Chamadas ao sistema

Processos fork

Chamadas ao sistema

Chamada ao sistema: fork


Sumario Criar um processo lho

Chamadas ao sistema (system calls) fork - create a child process exit - terminate the current process getpid - get current process identication getppid - get parent process identication wait - wait for process termination waitpid - wait for process termination Valor de retorno Esta chamada ao sistema retorna duas vezes: uma no contexto do processo original (pai) e outra no contexto do novo processo (llho). Em caso de erro so retorna uma vez (valor -1 no contexto do processo pai).
Jose Pedro Oliveira Chamadas ao sistema Processos fork

Synopsis #include <sys/types.h> #include <unistd.h> pid t fork(void);

Jose Pedro Oliveira Chamadas ao sistema

Processos fork

Fork: uma invocacao, dois retornos

Chamada ao sistema: fork - exemplo 1


Exemplo 1

processo pai
1

processo lho

fork
3

fork
3

1 2 3 4 5 6 7 8 9 10 11 12 13

# include <s t d i o . h> # include <u n i s t d . h> i n t main ( void ) { p r i n t f ( Antes \n ) ; fork ( ) ; p r i n t f ( Depois \n ) ; return 0; }

Jose Pedro Oliveira

Processos

Jose Pedro Oliveira

Processos

Chamadas ao sistema

fork

Chamadas ao sistema

fork

Chamada ao sistema: fork - exemplo 2


Exemplo 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 # include <s t d i o . h> # include <sys / t y p e s . h> # include <u n i s t d . h> i n t main ( void ) { pid t p; p = fork ( ) ; p r i n t f ( p = %d\n , p ) ; return 0; } / pid t /

Chamada ao sistema: fork - valor de retorno

Valor de retorno -1 - Insucesso: o valor -1 e retornado no contexto do processo pai e nenhum processo lho e criado. 0 - Sucesso: o valor 0 e retornado no contexto do processo lho (novo processo). > 0 - Sucesso: o PID do processo lho e retornado no contexto do processo pai (processo original).

Jose Pedro Oliveira Chamadas ao sistema

Processos fork

Jose Pedro Oliveira Chamadas ao sistema

Processos fork

Chamada ao sistema: fork - exemplo 3


Exemplo 3 (extracto)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 p = fork ( ) ; i f ( p == 1) { / Erro / } else i f ( p == 0 ) { / Filho / } else i f ( p > 0 ) { / Pai / }
Jose Pedro Oliveira Chamadas ao sistema Processos exit

Chamada ao sistema: fork - exemplo 4


Exemplo 4 (extracto)
1 2 3 4 5 6 7 8 9 10 11 12 13 p = fork ( ) ; switch ( p ) { case 1 : / Erro / break ; case 0 : / Codigo a e x e c u t a r no processo f i l h o / break ; default : / Codigo a e x e c u t a r no processo p a i / break ; }

Jose Pedro Oliveira Chamadas ao sistema

Processos exit

Chamada ao sistema: exit


Sumario Finalizar processo corrente Synopsis #include <unistd.h> void exit(int status); Valor de retorno Esta chamada ao sistema termina imediatamente o processo invocador (nao retorna). O valor status (0..255) e retornado ao processo pai, que o pode recolher atraves da chamada ao sistema wait.

Finalizacao de um processo

Finalizacao de um processo Finalizacao normal


Retorno a partir de main Invocar exit Invocar exit ou Exit Retorno da ultima thread Invocar pthread exit a partir da ultima thread

Finalizacao anormal
Invocar abort Recepcao de um sinal Resposta da ultima thread a um pedido de cancelamento

Jose Pedro Oliveira Chamadas ao sistema

Processos exit

Jose Pedro Oliveira Chamadas ao sistema

Processos exit

Finalizacao de um processo

Exemplos de metodos de terminacao


Exemplo

Notas Quando a chamada ao sistema exit e invocada, o processo corrente e terminado imediatamente: todos os descritores de cheiros abertos sao fechados todos os processos lhos passam a ter como pai o processo init (pid = 1) o sinal SIGCHLD e enviado ao processo pai Chamada ao sistema exit vs funcao exit Sempre que possvel utilizar a funcao exit da biblioteca de C em detrimento da chamada ao sistema exit. Informacao adicional nas paginas man: man 2 exit e man 3 exit.

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

# include <s t d i o . h> # include < s t d l i b . h> # include <u n i s t d . h> void f 1 ( void ) { ... exit (1); } void f 2 ( void ) { ... abort ( ) ; } i n t main ( void ) { f1 ( ) ; f2 ( ) ; return 0; }

/ Normal /

/ Anormal /

/ Normal /

Jose Pedro Oliveira

Processos

Jose Pedro Oliveira

Processos

Chamadas ao sistema

getpid, getppid

Chamadas ao sistema

getpid, getppid

Chamadas ao sistema: getpid, getppid

Chamadas ao sistema: getpid/getppid - exemplo 1


Exemplo 1

Sumario A chamada ao sistema getpid permite obter o identicador de processo (PID) do processo corrente. A chamada so sistema getppid permite obter o PID do pai do processo corrente. Synopsis #include <sys/types.h> #include <unistd.h> pid t getpid(void); pid t getppid(void);

1 2 3 4 5 6 7 8 9 10 11 12 13

# include <s t d i o . h> # include <sys / t y p e s . h> # include <u n i s t d . h> i n t main ( void ) { pid t p = fork ( ) ;

/ pid t /

p r i n t f ( p = %5d p i d = %5d p p i d = %5d\n , p , getpid ( ) , getppid ( ) ) ; return 0; }

Jose Pedro Oliveira Chamadas ao sistema

Processos getpid, getppid

Jose Pedro Oliveira Chamadas ao sistema

Processos getpid, getppid

Chamadas ao sistema: getpid/getppid - exemplo 1

Chamadas ao sistema: getpid/getppid - exemplo 2


Exemplo 2

Resultado 1 p = 0 p = 4284

pid = pid =

4284 4283

ppid = ppid =

4283 2849

Resultado 2 - processo pai termina antes da invocacao de getppid() no processo lho p = 4307 pid = 4306 ppid = 2849 p = 0 pid = 4307 ppid = 1 Adopcao de processos Quando um processo ca orfao e imediatamente adoptado pelo processo init (processo com o PID 1).

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

# include # include # include # include

<s t d i o . h> <s t d l i b . h> <u n i s t d . h> <sys / t y p e s . h>

/ p i d t /

i n t main ( void ) { pid t p = fork ( ) ; i f ( p == 1) { / E r r o /

p e r r o r ( f o r k ) ; e x i t ( EXIT FAILURE ) ; } else i f ( p == 0 ) { / F i l h o / p p i d = %5d\n ,

p r i n t f ( F i l h o : p = %5d p i d = %5d p , getpid ( ) , getppid ( ) ) ; } else {

/ Pai ( p > 0 ) / p p i d = %5d\n ,

p r i n t f ( Pai : p = %5d p i d = %5d p , getpid ( ) , getppid ( ) ) ; } return 0; }

Jose Pedro Oliveira Chamadas ao sistema

Processos wait, waitpid

Jose Pedro Oliveira Chamadas ao sistema

Processos wait, waitpid

Chamadas ao sistema: wait e waitpid

Chamadas ao sistema: wait e waitpid


wait A chamada ao sistema wait suspende o processo corrente ate que um dos seus processos lhos termine. waitpid A chamada ao sistema waitpid suspende o processo corrente ate que o lho especicado mude de estado. Por omissao so espera que o lho em questao termine mas este comportamento pode ser alterado atraves do argumento options. Mudancas de estado: o processo lho terminou o processo lho foi congelado (stopped) o processo lho foi descongelado (resumed)

Sumario Estas chamadas ao sistema permitem esperar pela mudanca de estado de um processo lho e obter informacao sobre essa mudanca. Synopsis #include <sys/types.h> #include <sys/wait.h> pid t wait(int *status); pid t waitpid(pid t pid, int *status, int options);

Jose Pedro Oliveira Chamadas ao sistema

Processos wait, waitpid

Jose Pedro Oliveira Chamadas ao sistema

Processos wait, waitpid

Fork, Wait e Exit

Chamada ao sistema: wait - exemplo 1


Exemplo 1 (extracto)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 p = fork ( ) ; i f ( p == 1) { p e r r o r ( f o r k ) ; e x i t ( EXIT FAILURE ) ; } else i f ( p == 0 ) { p r i n t f ( F i l h o \n ) ; s l e e p ( 3 ) ; } else i f ( p > 0 ) { p r i n t f ( Pai \n ) ; w a i t ( NULL ) ; / Esperar que o f i l h o t e r m i n e / p r i n t f ( Fim\n ) ; }

fork

pai

lho

wait

exit

Jose Pedro Oliveira

Processos

Jose Pedro Oliveira

Processos

Chamadas ao sistema

wait, waitpid

Chamadas ao sistema

wait, waitpid

Chamada ao sistema: wait - exemplo 1


Exemplo 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # include # include # include # include # include <s t d i o . h> <s t d l i b . h> <u n i s t d . h> <sys / t y p e s . h> <sys / w a i t . h>

Chamadas ao sistema: wait, waitpid - macros (1/2)

Relacao entre wait() e waitpid() wait(&status) == waitpid(-1, &status, 0) Macros WIFEXITED(status) - permite determinar se o processo lho terminou normalmente. WEXITSTATUS(status) - permite obter o codigo de sada do processo lho (argumento da funcao exit). Esta macro so deve ser invocada se WIFEXITED returnar um valor verdadeiro.

i n t main ( void ) { pid t p = fork ( ) ; i f ( p == 1) { perror ( fork ) ; e x i t ( EXIT FAILURE ) ; } else i f ( p == 0 ) { / F i l h o / p r i n t f ( F i l h o \n ) ; sleep ( 3 ) ; } else i f ( p > 0 ) { p r i n t f ( Pai\n ) ; w a i t ( NULL ) ; / Esperar que o f i l h o t e r m i n e / p r i n t f ( Fim\n ) ; } return 0; }

Jose Pedro Oliveira Chamadas ao sistema

Processos wait, waitpid

Jose Pedro Oliveira Chamadas ao sistema

Processos wait, waitpid

Chamadas ao sistema: wait, waitpid - macros (2/2)


Macros WIFSIGNALED(status) - permite determinar se o processo lho terminou devido a um sinal nao interceptado. WTERMSIG(status) - permite obter o numero do sinal que provocou a nalizacao do processo lho. Esta macro so deve ser invocada se WIFSIGNALED returnar um valor verdadeiro. WCOREDUMP(status) - permite saber se foi gerado um cheiro core. WIFSTOPPED(status) - permite determinar se o processo lho que provocou o retorno se encontra congelado (stopped). WSTOPSIG(status) - permite obter o numero do sinal que provocou o congelamento do processo lho. Esta macro so deve ser invocada se WIFSTOPPED returnar um valor verdadeiro. WIFCONTINUED(status) - permite determinar se o processo lho foi descongelado (resumed). So aplicavel para em kernels 2.6.10 ou mais recentes.

Chamada ao sistema: wait - exemplo 2


Extracto de codigo (processo pai)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 q = w a i t (& s t a t u s ) ; i f ( q == 1) { / Erro / } else i f ( q > 0 ) { / q > p i d do processo que t e r m i n o u / i f ( WIFEXITED ( s t a t u s ) ) { / Processo q t e r m i n o u normalmente / / Codigo de s a i d a = WEXITSTATUS( s t a t u s ) / } else { / Processo q t e r m i n o u anormalmente / } }

Jose Pedro Oliveira Referencias

Processos

Jose Pedro Oliveira Referencias

Processos

Conteudo

Referencias
Bibliograa

Programas e Processos Chamadas ao sistema fork exit getpid, getppid wait, waitpid Referencias

Advanced Programming in the UNIX Environment, 2nd ed. W. Richard Steven, Stephen A. Rago http://www.apuebook.com/ Captulo 1 - UNIX System Overview Captulo 7 - Process Environment Captulo 8 - Process Control Advanced Programming in the UNIX Environment W. Richard Steven http://www.kohala.com/start/apue.html Linux Programming by Example: The Fundamentals Arnold Robbins http://authors.phptr.com/robbins/

Jose Pedro Oliveira

Processos

Jose Pedro Oliveira

Processos

Anda mungkin juga menyukai