Ir para o conteúdo
AJBM

[Resolvido] Processos

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por AJBM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

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.