Jump to content
AJBM

[Resolvido] Processos

Recommended Posts

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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"

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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).

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Edited by AJBM

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.