Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% acharam este documento útil (0 voto)
100 visualizações8 páginas

Fork

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1/ 8

Criao de Processos O modelo UNIX

O processo progenitor (pai) cria processos prognitos (lhos), os quais, por sua vez, criam outros processos, formando uma rvore de processos. O lho criado pela chamada ao sistema
fork() duplica o espao de memria do pai. Pai e lho(s) executam concorrentemente. A partir da instruo a seguir o fork() A funo fork() devolve valores diferentes para o processo pai e processo lho permitindo assim o programa pode tomar varias linhas de aco atravs duma instruo de controlo (if) . O processo pai pode esperar a terminao do lho usando a chamada wait()
Win 32 api ver spawn etc

alunos:~ darwin-crocker$ man fork NAME fork - create a new process SYNOPSIS #include <sys/types.h> pid_t fork(void); DESCRIPTION fork() causes creation of a new process. The new process (child process) is an exact copy of the calling process (parent process) except for the following: o The child process has a unique process ID. o The child process has a different parent process ID (i.e., the process ID of the parent process). o The child process has its own copy of the parent's descriptors. #include <unistd.h>

etc.

RETURN VALUES Upon successful completion, fork() returns a value of 0 to the child process and returns the process ID of the child process to the parent process. Otherwise, a value of -1 is returned to the parent process, no child process is created, and the global variable errno is set to indicate the error.

Page #

#include <stdio.h> #include <sys/types.h> #include <unistd.h> main() { int pid; pid=fork(); if ( pid < 0 ) { fprintf(stderr,"erro\n"); exit(1); } if ( 0 ==pid ) printf("FILHO: \t id is %d, pid (valor)is %d\n",getpid(), pid); else printf("PAI: \t id is %d, pid (lho)is %d\n", getpid(), pid); /* este comando executado duas vezes..*/ system("date"); } alunos:~/so/cprogs/forks crocker$ ./fork1x PAI: id is 22571, pid (lho) is 22572 FILHO: id is 22572, pid (valor) is 0 Tue Mar 29 12:19:44 WEST 2005 Tue Mar 29 12:19:44 WEST 2005

Substituio do Programa Velho pelo Novo


O lho (ou pai) pode carregar um novo programa usando a chamada ao sistema exec(). A chamada ao exec necessita o nome dum novo programo. O texto e variveis do programa velho so substitudo pelo novo. O programa novo herde o identificador do processo (PID) e outras informaes como p.ex acesso aos ficheiros que anteriormente tinham sido abertos.
If (0==fork()) exec(ls", ...);

Page #

Exemplo 1
main() { fork() printf(hello\n); } main hello hello fork

Exemplo 2

main() { fork() fork() printf(hello\n); } hello hello hello hello fork fork

Page #

Exemplo 3

hello main() { fork() fork() fork() printf(hello\n); } fork hello hello hello hello hello hello hello fork fork

main() { for (i=0;i<2;i++) fork() printf(Ola\n) }

Exerccio 1

doit() { fork() fork() printf(hello\n) } main() { doit() printf(Ola\n) }

Exerccio 2

Page #

Exerccio 3 - Exame 2007


(a) Explique a chamada ao sistema fork() ? (b) Qual o output do seguinte programa? int main() { int pid, x = 4; pid = fork(); if ( 0 == pid ) { fork(); x=x+2; } else { x--; } printf(x=%d\n,x); }

Exemplo 4 : com Exec


main() { if (0 == fork() ) printf( Filho\n) else { printf("Ficheiros na directoria:\n" ); execl( "/bin/ls", "ls", "-l", 0 ); printf( Pai\n); } printf(Fim\n); }

Page #

Exerccio 4
O que ser escrito no cheiro e porque ? main() { FILE *fp=fopen(out.txt,w); fprintf (fp,Bom Dia); if (0 == fork() ) { fprintf( fp , Filho\n); cose(fp); } else { fprintf( fp, Pai\n); } } Output bufferizado escrito para cheiro quando ? A limpeza da buffer do apontador para o cheiro feito usando fush() ou quando a buffer estiver cheia ou usando um \n (normalemente!)

Exerccio 5
O que ser escrito na ecr, em qual ordem e porque ? main() { printf (Bom Dia ); if (0 == fork() ) printf( Filho\n) else printf( Pai\n); }

Page #

Exerccio (win32)
O programa teste.exe e casa.exe so os executveis criados a partir dos programas em baixo. Explique o programa teste.c e os dois outputs possveis de execuo do programa test.exe
//teste.c main(int argc, char **argv) { int N, pid; pid = spawnl( WAIT , "casa.exe", "casa.exe", NULL); printf(Fundao\n); pid = spawnl( NOWAIT , "casa.exe", "casa.exe", NULL); printf(Canhoso\n); } //casa.c main(int argc, char **argv) { printf("Morada : Covilha\n"); getchar(); }

Terminao
Um processo pode terminar a si prprio com uma chamada a exit() os seus filhos so depois herdados pelo processo init (PID=1). Processos pais podem esperar para a terminao dos seus filhos usando a chamada ao sistema wait(). Se um filho j tinha terminada (i.e., tornou-se zombie) quando wait() for chamada ento wait() retorne imediatamente Caso contrario o processo pai bloqueia, esperando um sinal do OS a indicar que o filho terminou. Zombie The Undead a situao onde um processo no pode morrer devido o facto de est a espera de enviar um sinal para o
prpcesso pai. Onde que est no diagrama de 5 estados ?

Page #

Terminao
exit() terminates the calling process. Before termination, all les are closed, buffered output (waiting to be output) is written, and any registered "exit functions" (posted with atexit) are called. _exit() terminates execution without closing any les, ushing any output, or calling any exit functions. abort() == _exit(3); Signals normally raise an _exit(x)
void exit_fn1(void){ printf("funo fn-1 do exit chamada\n"); } int main() { /* post exit function #1 */ atexit(exit_fn1); printf(ola ); exit(1); printf(Adeus); } $a.out ola funo fn-1 do exit chamada $ $a.out Programa com exit $ } int main(void) { printf(Programa com _exit\n); fush(stdout); printf(ola); _exit() ; printf(Adeus);

Page #

Você também pode gostar