Condor
• Objetivo
– Verificar na prática o funcionamento das primitivas fork e join
• Roteiro
– Chamada de sistema fork – Chamada de sistema wait – Exemplos de código em C – Exercício de programação em C – Questionário
INF01151 – Sistemas Operacionais II N – 2006/2 Prof. Cláudio Geyer / Rômulo Rosinha
fork/join no UNIX
• Chamada de sistema fork
– Cria um novo processo (processo filho) a partir de um processo existente (processo pai) – Código do programa é idêntico – Execução do processo filho inicia no próximo comando do programa – Processo filho é uma cópia 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. Cláudio Geyer / Rômulo Rosinha
fork/join no UNIX
• Chamada de sistema fork processo fork()
retorna -1 em caso de erro, situação de falta de memória 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. Cláudio Geyer / Rômulo Rosinha
fork/join no UNIX
• Chamada de sistema wait/waitpid
– Equivalente a primitiva join – Suspende processo pai até que
• termine a execução 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. Cláudio Geyer / Rômulo Rosinha
fork/join no UNIX
// e1.c #include #include 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); } }