Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
so:criacao_de_processos [2011/09/26 22:30] – [Observações] maziero | so:criacao_de_processos [2022/11/04 13:00] (atual) – maziero | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Criação de processos em Unix ====== | ||
+ | A criação de processos em UNIX é feita através das chamadas de sistema '' | ||
+ | |||
+ | ===== Exercício 1 ===== | ||
+ | |||
+ | Dado o programa '' | ||
+ | |||
+ | <code c fork.c> | ||
+ | /* | ||
+ | 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", | ||
+ | retval = fork () ; | ||
+ | printf (" | ||
+ | |||
+ | if ( retval < 0 ) // erro no fork() | ||
+ | { | ||
+ | perror (" | ||
+ | exit (1) ; | ||
+ | } | ||
+ | else | ||
+ | if ( retval > 0 ) // sou o processo pai | ||
+ | wait (0) ; | ||
+ | else // sou o processo filho | ||
+ | sleep (5) ; | ||
+ | |||
+ | printf (" | ||
+ | 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 '' | ||
+ | |||
+ | <code c fork-execve.c> | ||
+ | /* | ||
+ | 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", | ||
+ | retval = fork () ; | ||
+ | printf (" | ||
+ | |||
+ | if ( retval < 0 ) // erro no fork () | ||
+ | { | ||
+ | perror (" | ||
+ | exit (1) ; | ||
+ | } | ||
+ | else | ||
+ | if ( retval > 0 ) // sou o processo pai | ||
+ | wait (0) ; | ||
+ | else // sou o processo filho | ||
+ | { | ||
+ | execve ("/ | ||
+ | perror (" | ||
+ | } | ||
+ | |||
+ | printf (" | ||
+ | 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 '' | ||
+ | |||
+ | ===== Exercício 3 ===== | ||
+ | |||
+ | Dado o programa '' | ||
+ | |||
+ | <code c fork-print.c> | ||
+ | /* | ||
+ | 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 (" | ||
+ | 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 '' | ||
+ | |||
+ | ===== 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: |