Você está na página 1de 2

Processo 9 – janela da shell

O proc 9 é pai do proc 141 e o proc 141 é filho do proc 9

Processo 141 – programa fork1

O proc 141 é pai do proc 142 e o proc 142 é filho do proc 141

Processo 142 – programa criado pelo fork() dentro do programa fork1

Quando o proc 141 é criado é indicado no seu código quais as instruções a serem executadas. Isto
significa que o processo, segmento de texto, é preenchido com o código do programa.

No caso do proc 142, apenas é criado por invocação da função fork(), sem mais instruções. Então o que
é feito para este novo processo, é preencher o seu espaço de endereçamento com uma imagem idêntica
ao do seu. Entre outras informações, o código do pai ainda não executado vai ser executado pelo filho.

Proc 141 tem o código

#include <stdio.h> Vai criar o novo processo (142), vai


#include <sys/types.h> executar o código do pai que ainda
#include <unistd.h> não foi executado – código depois
desta instrução
int main(){
fork();

printf("PID = %i\n",getpid());
printf("PID pai = %i\n", getppid());

//fork();
}

Proc 142 vai ter o mesmo código


#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
Vai executar a partir daqui
int main(){
fork();

printf("PID = %i\n",getpid());
printf("PID pai = %i\n", getppid());

//fork();
}

RAM

Processos do SO | Processos do utilizador | Proc 141 | Proc 142| …|

fork() a execução faz criar um processo e no fim da execução vai retorna um valor inteiro. Este valor é
interpretado desta form
fork() = 0, então estamos no contexto do processo filho – processo que foi criado
fork() > 0 , este valor positivo é a identificação do processo filho que foi criado e estamos no contexto do
processo pai
fork() < 0, deu um erro na criação do processo filho e não possível concluir a criação com sucesso.

Processo com código fonte fork2


#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
Criar o processo filho
int main(){
pid_t k;
k = fork();

if(k==0)/*estamos no contexto do filho*/{


printf("filho: é o filho que está a ser executado\n");
printf("filho: PID = %i; PID pai = %i\n",getpid(),getppid());
}
else if(k>0)/*pai em execução*/{
printf("pai: é o pai que está a ser executado\n");
printf("pai: PID = %i; PID pai = %i\n",getpid(),getppid());
printf("pai: o k (%i) é o pid do seu filho\n",k);
}
//fork();
}

Filho do processo anterior


Vai executar a partir
int main(){
daqui
pid_t k;
k = fork();

if(k==0)/*estamos no contexto do filho*/{


printf("filho: é o filho que está a ser executado\n");
printf("filho: PID = %i; PID pai = %i\n",getpid(),getppid());
}
else if(k>0)/*pai em execução*/{
printf("pai: é o pai que está a ser executado\n");
printf("pai: PID = %i; PID pai = %i\n",getpid(),getppid());
printf("pai: o k (%i) é o pid do seu filho\n",k);
}
//fork();
}

Você também pode gostar