Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

AJBM

[Resolvido] Processos

Mensagens Recomendadas

AJBM

Boas!

Eu tenho este codigo,

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

int main(){
 int i;
 for(i=0;i<2;i++){
   if(fork()==0){
     printf("[%d],Serei pai ou filho\n",getpid());
   }
 }
 return 0;
}

e eu tinha de saber sem executar o código quantas vezes aparecia a mensagem, Eu sei que a mensagem aparece 3 vezes. Eu penso que seja assim

P1-o que esta a executar o código

P2- filho do p1 em i=0, mostra a mensagem por causa do fork devolver 0 para o filho,

P3- filho do p1 em i=1, mostra a mensagem por causa do fork devolver 0 para o filho

P4-filho do p2 em i=1, mostra a mensagem por causa do fork devolver 0 para o filho

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

sim, a mensagem aparece 3 vezes, 1 para cada processo filho que é criado. isto porque a mensagem é apresentada somente ao processo ao qual o resultado da chamada da função fork, lhe aparece como 0.

como ao processo pai, o resultado é o número do processo filho (não é 0) então a mensagem não é apresentada.

conclusão, o que tens escrito para o P4 está errado.

exercíco : tenta agora por o processo pai esperar que os três processes filhos terminem, e só depois terminar


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

Mas o processo P2 não vai criar um processo?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(){
 int i;
 for(i=0;i<2;i++){
   if(fork()==0){
     printf("[%d],Serei pai ou filho\n",getpid());

   }else{
     wait(NULL);
   }
 }
 return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Mas o processo P2 não vai criar um processo?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(){
int i;
for(i=0;i<2;i++){
if(fork()==0){
printf("[%d],Serei pai ou filho\n",getpid());

}else{
 wait(NULL);
}
 }
return 0;
}

não, somente o processo pai é que cria processos.

tens de perceber que o código do processo filho "começa" no retorno da função fork, e como podes ver, não existe criação de processos após essa chamada.

exercício : ok, isso é uma interpretação do exercício, o que queria dizer seria : "o processo pai cria os três processos e depois espera que os três terminem para este terminar também


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

eu fiz umas pequenas alterações ao código de cima.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(){
 int i;
 for(i=0;i<2;i++){
   if(fork()==0){
     printf("[%d\\%d],Serei pai ou filho\n",getpid(),getppid());
   }
   else{
     wait(NULL);
   }
 }
 return 0;
}

O resultado foi este:

[2446\2445],Serei pai ou filho

[2447\2446],Serei pai ou filho

[2448\2445],Serei pai ou filho

2445 é o pai, os outros são os filhos o 2446 cria um filho?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

por amos de deus ... indenta o código !!

o que aconteceu foi puro acaso ...

basta pores o filho a esperar um tempo qualquer que o resultado será diferente

o que acontece é que o processo filho ganha tempo do processador antes do processo pai terminar o ciclo o que leva a que seja esse a criar o processo referido.

mas uma coisa é certa, o segundo valor do primeiro output será sempre o id do processo inicial.

---

exercício : continuas a não fazer o processo inicial esperar pelo termino dos processos filhos, e já agora, podes prevenir que o que aconteceu suceda com um return dentro do "if"

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

Em relaçao a indentacao quando eu copio para aqui perde a indentação

Pensava que o wait era suposto fazer isso?

No entanto fiz algumas alteraçõesmesmo assim o resultado continua o mesmo.

Colocar o return dentro do if reduziu as mensagens , para duas mensagens

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

int main()
{
 int i;
 pid_t pid;

 pid=getpid();

 for(i=0;i<2;i++){

   if(fork()==0){
     printf("[%d\\%d],Serei pai ou filho\n",getpid(),getppid());

   }
   else if(pid>0){

     wait(NULL);

   }
 }
 return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

o que aconteceu foi puro acaso ...

basta pores o filho a esperar um tempo qualquer que o resultado será diferente

o que acontece é que o processo filho ganha tempo do processador antes do processo pai terminar o ciclo o que leva a que seja esse a criar o processo referido.

Já não mexo em processos há muitos anos, mas acho que o raciocínio inicial do AJBM estava correcto. Para i=0 só há um processo, que cria um processo filho.

Para i=1 já temos ambos os processos a chamarem o fork(), e cada um deles cria um filho.

Colocar um return dentro do if produz um resultado diferente, pois nesse caso o processo filho não passa para a 2ª iteração (logo só o pai é que cria mais processos).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

1º - sim duas mensagens, quando i = 0 e quando i = 1. como vês, desta forma o processo filho não executa o "for"

exercício : continuas longe da solução do pai esperar pelos três filhos, eu disse que ele esperaria somente depois de os criar (a todos)

solução:

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

int main()
{
 int i, pid, pids[3];

 printf("%d is the parent process\n", getpid());

 for(i = 0; i < 2; i++)
 {
   printf("%d creating process\n", getpid());
   if((pid = fork()) == 0)
   {
     // código do processo filho
     printf("[%d\\%d],Serei pai ou filho (%d)\n", getpid(), getppid(), i);
     return 0;
   }
   else
   {
     // código do processo pai
     // guardar o id do processo filho criado
     pids[i] = pid;
   }
 }

 // este código só é executado pelo processo pai
 for(i = 0; i < 2; i++)
 {
   waitpid(pids[i], NULL, 0);
 }

 return 0;
}

------------------------------

Já não mexo em processos há muitos anos, mas acho que o raciocínio inicial do AJBM estava correcto. Para i=0 só há um processo, que cria um processo filho.

Para i=1 já temos ambos os processos a chamarem o fork(), e cada um deles cria um filho.

Colocar um return dentro do if produz um resultado diferente, pois nesse caso o processo filho não passa para a 2ª iteração (logo só o pai é que cria mais processos).

sim tens razão, a indentação estava a confundir-me, assim como distracção minha


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

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

int main()
{
 int i, pid, pids[3];

 printf("%d is the parent process\n", getpid());

 for(i = 0; i < 2; i++)
 {
printf("%d creating process\n", getpid());
if((pid = fork()) == 0)
{
  // código do processo filho
  printf("[%d\\%d],Serei pai ou filho (%d)\n", getpid(), getppid(), i);
  return 0;
}
else
{
  // código do processo pai
  // guardar o id do processo filho criado
  pids[i] = pid;
}
 }

 // este código só é executado pelo processo pai------PORQUE QUE ESTE CODIGO É SO EXECUTADO PELO PAI ?
 for(i = 0; i < 2; i++)
 {
waitpid(pids[i], NULL, 0);
 }

 return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo
if((pid = fork()) == 0)
{
 printf("[%d\\%d],Serei pai ou filho (%d)\n", getpid(), getppid(), i);
 return 0; // <--------------- TERMINA O PROCESSO FILHO
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

OK. obrigado :thumbsup:

Ja agora

Considerando que o seguinte programa em C está a executar com o PID 3202:


fork();
fork();
fork();
fork();

Indique, justificando, quantos processos são criados pelo processo com o PID 3204.

Eu penso que sejam 2, mas não tenho a certeza

Editado por AJBM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

resposta:

"assumindo que os id's a serem atribuídos a cada processo criado, sejam contíguos (se bem me lembro, em linux não é garantido) o número de processos que o processo com o PID 3204 criará serão 2.

seja o processo inicial ou o primeiro processo criado (supostamente o 3203), o processo 3204 será sempre um processo criado pela chamada do segundo fork da lista de 4 chamadas existente no código."


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.