Jump to content
AJBM

[Resolvido] Processos

Recommended Posts

AJBM

Boas!

Alguem me pode explicar como isto funciona, eu ja tive a ler os apontamentos que o professor disponibilizou mas ainda nao percebi.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main() {
 pid_t pid;

 int i;
 pid=getpid();
 printf("Pai: %d\n",pid);
 for (i=0;i<2;i++){
   if(pid>0) pid=fork();
 }
 if (pid==0) printf("Sou um processo com o pid [%d] Pai com [%d]\n",getpid(),getppid());

 return 0;
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

o que percebeste tu de processos concorrentes ? é porque código sem teoria (neste assunto) não te serve de nada


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

Share this post


Link to post
Share on other sites
pmg

Cada vez que executas um fork() com sucesso o processo divide-se em dois quase iguais (um pai e um filho): no pai o valor devolvido pelo fork() é o valor do PID do filho; no filho o valor devolvido é zero.

A primeira vez do teu loop vai fazer um fork e portanto passas a ter dois processos: no processo pai, a variavel pid passa a ter o valor do processo filho; no processo filho a variavel pid passa a ter 0

A segunda vez do teu loop é executada pelos 2 processos. O processo pai (com o pid do primeiro filho) faz outro fork(); o processo filho (com pid igual a zero) nao faz fork(). Portanto ficam tres processos a correr: o pai original em que pid é o valor do ultimo filho; o primeiro filho com pid igual a zero; e o segundo filho também com pid igual a zero;

Depois acaba o loop e os tres processos chegam ao if(pid == 0).

So 2 processos é que tem pid igual a zero. O pai de qualquer desses processos é o pai original.

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
AJBM

Pouca coisa.

A pergunta desse exercicio é: Apresente o resultado da execução do programa seguinte. Assuma que o PID do processo pai é 2657

Pelo que eu entendi sao criados 3 processos, filho1,filho2,neto1(filho do filho1), por isso pensei que a mensagem deveria aparecer 3 vezes mas nao aparece eu queria saber porque

Share this post


Link to post
Share on other sites
pmg

O filho1 nao tem filhos porque o if() dentro do loop nao se lhe aplica (a variavel pid, no filho1, tem o valor zero)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
AJBM

Entao porque que o meu resultado da me isto:

Sou processo com pid[2658] Pai com [2657]

Sou processo com pid[2659] Pai com [1]---como vi este com 1 pensei que fosse filho do filho1

Edited by AJBM

Share this post


Link to post
Share on other sites
pmg

Hmm ... o pid 1 é reservado pelo Sistema Operativo para o init, que tem varias funcoes.

Por exemplo, quando um processo fica sem pai o init adopta esse orfao.

Suponho que no teu programa, o processo pai (pid #2657) terminou antes do processo filho (pid #2659) chegar ao printf()... e o init adoptou-o automagicamente.

Edited by pmg
Link to Wikipedia

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
AJBM

Ok.

Mas havia uma maneira de contornar esta situacao se eu usar o wait consigo resolver este problema certo?

Share this post


Link to post
Share on other sites
pmg

Mas havia uma maneira de contornar esta situacao se eu usar o wait consigo resolver este problema certo?

Certo. Por exemplo

       if (pid == 0) {
               printf("Sou um processo com o pid [%d]; pai com [%d]\n",
                      getpid(), getppid());
       } else {
               wait(NULL); /* espera pelhos filhos terminarem */
               printf("pai a terminar ...\n");
       }


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

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.