Sei sulla pagina 1di 8

fork/join no UNIX

Objetivo
Verificar na prtica o funcionamento das
primitivas fork e join

Roteiro
Chamada de sistema fork
Chamada de sistema wait
Exemplos de cdigo em C
Exerccio de programao em C
Questionrio
INF01151 Sistemas Operacionais II N 2006/2
Prof. Cludio Geyer / Rmulo Rosinha

fork/join no UNIX
Chamada de sistema fork
Cria um novo processo (processo filho) a partir de um
processo existente (processo pai)
Cdigo do programa idntico
Execuo do processo filho inicia no prximo
comando do programa
Processo filho uma cpia do processo pai, exceto
por
identificador de processo e identificador de processo pai
locks obtidos pelo processo pai

INF01151 Sistemas Operacionais II N 2006/2


Prof. Cludio Geyer / Rmulo Rosinha

fork/join no UNIX
Chamada de sistema fork
processo

fork()

retorna -1 em
caso de erro,
situao de falta
de memria por
exemplo

retorna 0 em
caso de
sucesso,
indicando ser o
processo filho

retorna >0 em
caso de
sucesso,
indicando ser o
processo pai

INF01151 Sistemas Operacionais II N 2006/2


Prof. Cludio Geyer / Rmulo Rosinha

fork/join no UNIX
Chamada de sistema wait/waitpid
Equivalente a primitiva join
Suspende processo pai at que
termine a execuo de um processo filho
processo pai receba um sinal para terminar

Libera os recursos do processo filho


Se o processo filho j terminou retorna
imediatamente (processo zombie)
INF01151 Sistemas Operacionais II N 2006/2
Prof. Cludio Geyer / Rmulo Rosinha

fork/join no UNIX
// e1.c
#include <sys/types.h>
#include <unistd.h>
int main(void) {
int pid, status;
pid = fork();
if (pid == -1) { /* erro na chamada de sistema */
perror("erro no fork!");
exit(-1);
} else if (pid == 0) { /* processo filho */
printf("processo: filho\t pid: %d\t ppid: %d\n", getpid(), getppid());
_exit(0);
} else { /* processo pai */
wait(&status);
printf("processo: pai\t pid: %d\t ppid: %d\n", getpid(), getppid());
exit(0);
}
}
INF01151 Sistemas Operacionais II N 2006/2
Prof. Cludio Geyer / Rmulo Rosinha

fork/join no UNIX
// e2.c
#include <sys/types.h>
#include <unistd.h>
int main(void) {
int pid, status, k = 0;
printf("processo: ?\t pid: %d\t antes do fork\n", getpid());
pid = fork();
printf("processo: ?\t pid: %d\t depois do fork\n", getpid());
if (pid == -1) { /* erro na chamada de sistema */
perror("erro no fork!");
exit(-1);
} else if (pid == 0) { /* processo filho */
k += 1000;
printf("processo: filho\t pid: %d\t k: %d\n", getpid(), k);
_exit(0);
} else { /* processo pai */
wait(&status);
k += 10;
printf("processo: pai\t pid: %d\t k: %d\n", getpid(), k);
exit(0);
}
k += 10;
printf("processo: ?\t pid: %d\t k: %d\n", getpid(), k);
}

INF01151 Sistemas Operacionais II N 2006/2


Prof. Cludio Geyer / Rmulo Rosinha

fork/join no UNIX
Exerccio
Escrever um programa em C que cria uma rvore de 3
processos
onde o processo A faz um fork() criando o processo B
onde o processo B, por sua vez, faz um fork() criando o processo C

Cada processo deve exibir uma mensagem "Sou o processo X"


Utilizar wait() para garantir que a ordem de impresso das
mensagens seja
Sou o processo C
Sou o processo B
Sou o processo A

Utilizar sleep(2) antes da mensagem de C e sleep(1) antes da


mensagem de B

INF01151 Sistemas Operacionais II N 2006/2


Prof. Cludio Geyer / Rmulo Rosinha

fork/join no UNIX

Questes
1.
2.
3.
4.
5.
6.

7.

Quais so os possveis valores de retorno de fork e quais seus significados?


Quais so os possveis valores de retorno de wait e quais seus significados?
Na execuo de um fork, o que se pode concluir sobre a relao existente
entre o ppid do processo filho e o pid do processo pai?
Quais as principais diferenas entre a primitiva fork proposta por Conway
(1963) e a implementao de fork no UNIX?
Quais as principais diferenas entre a primitiva join proposta por Conway
(1963) e a implementao de wait no UNIX?
Em relao ao segundo exemplo (e2.c), o que pode ser observado a partir da
execuo do programa no que diz respeito ao nmero de vezes que as
mensagens antes do fork e depois do fork so exibidas?
Ainda em relao ao segundo exemplo (e2.c), explique o que acontece caso a
linha 16 (_exit(0);) do programa for comentada? Compare com a execuo do
programa original.

INF01151 Sistemas Operacionais II N 2006/2


Prof. Cludio Geyer / Rmulo Rosinha

Potrebbero piacerti anche