====== Criação de processos em Unix ====== A criação de processos em UNIX é feita através das chamadas de sistema ''fork'' e ''execve''. Estes exercícios têm por objetivos mostrar exemplos do uso dessas chamadas e estimular o aluno a compreender sua dinâmica. ===== Exercício 1 ===== Dado o programa ''fork.c'' a seguir: /* Criação de processos em UNIX. Compilar com gcc -Wall fork.c -o fork Carlos Maziero, DINF/UFPR 2020 */ #include #include #include #include #include int main () { int retval ; printf ("Ola, sou o processo %5d\n", getpid()) ; retval = fork () ; printf ("[retval: %5d] sou %5d, filho de %5d\n", retval, getpid(), getppid()) ; if ( retval < 0 ) // erro no fork() { perror ("Erro") ; exit (1) ; } else if ( retval > 0 ) // sou o processo pai wait (0) ; else // sou o processo filho sleep (5) ; printf ("Tchau de %5d!\n", getpid()) ; exit (0) ; } - Analise seu código e o comente detalhadamente. - Desenhe o [[diagrama de tempo]] de sua execução. ===== Exercício 2 ===== Dado o programa ''fork-execve.c'' a seguir: /* Criação de processos em UNIX, com execução de outro binário Compilar com gcc -Wall fork-execve.c -o fork-execve Carlos Maziero, DINF/UFPR 2020 */ #include #include #include #include #include int main (int argc, char *argv[], char *envp[]) { int retval ; printf ("Ola, sou o processo %5d\n", getpid()) ; retval = fork () ; printf ("[retval: %5d] sou %5d, filho de %5d\n", retval, getpid(), getppid()) ; if ( retval < 0 ) // erro no fork () { perror ("Erro: ") ; exit (1) ; } else if ( retval > 0 ) // sou o processo pai wait (0) ; else // sou o processo filho { execve ("/bin/date", argv, envp) ; perror ("Erro") ; } printf ("Tchau de %5d!\n", getpid()) ; exit (0) ; } - Analise seu código e o comente detalhadamente. - Desenhe o [[diagrama de tempo]] de sua execução. - O que ocorre se o programa a ser executado por ''execve'' não existir? Desenhe o diagrama de tempo que retrata essa situação. ===== Exercício 3 ===== Dado o programa ''fork-print.c'' a seguir: /* Criação de processos em UNIX, com impressão de valores de variável. Compilar com gcc -Wall fork-print.c -o fork-print Carlos Maziero, DINF/UFPR 2020 */ #include #include #include #include #include int main () { int retval, x ; x = 0 ; retval = fork () ; printf ("No processo %5d x vale %d\n", getpid(), x) ; if ( retval < 0 ) { perror ("Erro") ; exit (1) ; } else if ( retval > 0 ) { x = 0 ; wait (0) ; } else { x++ ; sleep (5) ; } printf ("No processo %5d x vale %d\n", getpid(), x) ; exit (0) ; } - Analise seu código e o comente detalhadamente. - Desenhe o [[diagrama de tempo]] de sua execução, indicando a evolução do valor da variável ''x''. ===== Observações ===== * Informações detalhadas sobre as chamadas de sistema utilizadas podem ser encontradas nas páginas de manual do sistema UNIX. * Um relatório [[teaching:regras das atividades de laboratorio#relatórios|no formato apropriado]] deve ser produzido pelo aluno, contendo os resultados obtidos nos exercícios.