Jump to content

[Resolvido] Processos


Recommended Posts

Posted

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

Posted

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
Posted

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;
}
Posted

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
Posted

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?

Posted (edited)

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
Posted

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;
}
Posted

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).

Posted

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
Posted

#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;
}

Posted (edited)

OK. obrigado 👍

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
Posted

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.