Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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
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
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);
}
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
fork/join no UNIX
Questes
1.
2.
3.
4.
5.
6.
7.