Вы находитесь на странице: 1из 7

Exerccio 1

Dado o programa fork.c a seguir:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main (){
intretval ;
printf ("Ola, sou o processo %5d\n", getpid()) ; //Imprime numero do processo atual
retval = fork () ; ; // fork clona o processo atual e retorna o PID processo filho para a
varivel retval
printf ("[retval: %5d] sou %5d, filho de %5d\n", retval, getpid(), getppid()) ; // Ao
executar esta linha no processo pai, retval vai exibir o PID do filho, seguido do PID do processo
principal (getpid()) e o PID do pai do processo principal (getppid())

if ( retval< 0 ) { // se retval for < 0 significa que o filho no foi gerado pelo fork
perror ("Erro") ;
exit (1) ;
}
else
if ( retval> 0 ) // se retval for > que 0 significa que o fork funcionou e retornou
o PID do filho
wait (0) ; // aguarda a processo filho terminar para retornar a execuo
do pai
else
sleep (5) ;// aguarda 5 segundos
printf ("Tchau de %5d!\n", getpid()) ; // exibe a mensagem e o PID do processo
atual, do pai ou filho
exit (0) ;
}
1.2 Desenhe o diagrama de tempo de execuo
Exerccio 2
Dado o programa fork-execve.c a seguir:

2.1 - Analise o cdigo e o comente detalhadamente


#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main (int argc, char *argv[], char *envp[])


{
int retval ; //criada varivel retval do tipo inteiro para receber o PID do filho

printf ("Ola, sou o processo %5d\n", getpid()) ; //Imprime numero do processo atual

retval = fork () ; ; // fork clona o processo atual e retorna o PID processo filho para a
varivel retval
printf ("[retval: %5d] sou %5d, filho de %5d\n", retval, getpid(), getppid()) ; // Ao
executar esta linha no processo pai, retval vai exibir o PID do filho, seguido do PID do processo
principal (getpid()) e o PID do pai do processo principal (getppid())

if ( retval < 0 ) // se retval for < 0 significa que o filho no foi gerado pelo fork
{
perror ("Erro: ") ;
exit (1) ;
}
else
if ( retval > 0 ) // se retval for > que 0 significa que o fork funcionou e retornou o
PID do filho
wait (0) ; ; // aguarda a processo filho terminar para retornar a execuo do pai
else // significa que retval = a 0, ou seja, o fork retornou 0, portanto estamos no
processo filho.
{
execve ("/bin/date", argv, envp) ; //dentro do processo filho, ser executado o
programa apontado por "/bin/date" atravs da chamada execve.
perror ("Erro") ; //caso a chamada execve retorne erro ser exibido uma msg na
tela
}

printf ("Tchau de %5d!\n", getpid()) ; // se o execve for executado com suvesso, a


msg mostrar o PID do pai, seno mostrar o PID do filho, e retornar para o pai e
mostrar o PID do pai.
exit (0) ;
}
2.2 Desenhe o diagrama de tempo de execuo

2.3 O que ocorre se o programa a ser executado por execve no existir? Desenhe o diagrama
de tempo que retrata essa situao.
R: Se o programa no existir ser exibido o erro correspondente a falha na execuo
"No such file or directory" seguido do prox comando ainda no processo filho, no caso " printf
("Tchau de %5d!\n", getpid())", e depois executando o mesmo comando no processo pai.

exemplo do comando execve executado com sucesso.

exemplo do comando execve executado sem sucesso.


Exerccio 3
Dado o programa fork-print.c a seguir:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

int main ()
{
int retval, x ;

x = 0 ; // atribuido o valor 0 a varivel x

retval = fork () ; // fork clona o processo atual e retorna o PID processo filho para a varivel
retval
printf ("No processo %5d x vale %d\n", getpid(), x) ; //mostra o PID do
processo atual e o valor de X, neste ponto X ser sempre 0,
tanto na execuo do filho quanto na execuo do pai
if ( retval < 0 ) //se houver erro na criao do processo filho o
valor de fork ser menor que 0
{
perror ("Erro") ; // ser exibido um erro caso o fork no seja
executado com sucesso
exit (1) ;
}
else
if ( retval > 0 ) // se o fork for executado com sucesso o valor de
retval ser maior que 0 (PID do filho)
{
x = 0 ; //se o filho foi criado corretamente e estivermos no
processo pai
wait (0) ; // o pai aguarda a execuo e finalizao do filho
para proceguir
}
else
{
x++ ; // quando o processo filho
estiver sendo executado (retval=0) a varivel x ser
incrementada de +1
sleep (5) ; //aguarda 5 segundos
}
printf ("No processo %5d x vale %d\n", getpid(), x) ; // nesta linha, quando
estivermos no processo filho, o X ser 1, quando estivermos no
processo pai o X ser 0
exit (0) ;
}
3.2 - Desenhe o diagrama de tempo de sua execuo, indicando a evoluo do valor da varivel
x.

Вам также может понравиться