domingo, 23 de setembro de 2012

Entendendo Processos do Unix com Programas em C – Parte 2 – Criação de Processos

Continuando a replicação do trabalho do meu amigo Joelson:



Como Funciona a Criação de Processos
Os processos pai criam processos filhos, que, por sua vez, criam outros processos, formando uma árvore de processos.
Durante a execução, pai e filhos são executados concorrentemente, porém o pai espera até que os filhos terminem suas execuções.
Um ponto interessante a se observar é que quando o processo pai gera um processo filho, na verdade o processo filho é exatamente a cópia do processo pai, porém o filho pode ou não carregar um novo programa nele para que tenha outro conteúdo.
Nos sistemas Unix, as chamadas de sistema (system-call)
  • fork cria novo processo (processo filho)
  • exec que é usada após o fork substitui o espaço de memória do processo por um novo programa
  • wait faz com que o processo pai permaneça bloqueado até seus filhos terminarem suas execuções.
Quando um processo é criado, um novo bloco de controle de processo (PCB) é criado para o processo.
Quando o fork é executado, o sistema copia o processo corrente e o executa. O valor de retorno de todo processo filho é ’0′ (zero), enquanto do processo pai é retornado o identificador (process identification – pid) do processo filho. Normalmente usamos o valor de retorno para identificarmos se o processo que está executando é o pai ou o filho.
Colocando a Mão na Massa
Para testarmos os conceitos acima ditos, vamos para mais um programinha em C:


 #include <stdio.h>  
 #include <sys/types.h>  
 #include <unistd.h>  
 int main() {  
   if(fork() == 0) {  
     printf(“Eu sou o filho\n”);  
   } else {  
     printf(“Eu sou o pai\n”);  
   }  
 }  

Para compilarmos o arquivo:

gcc -o ProcessosPaiFilho ProcessosPaiFilho.c
E para executarmos:
./ProcessosPaiFilho
Repare que nossa saída foi:
Eu sou o pai
Eu sou o filho
Explicando o conteúdo do programa acima, podemos reparar o seguinte:
Quando no primeiro ‘if’ chamamos a função fork(), é gerado e processado um novo processo filho e que é cópia deste mesmo programa. Ambos são executados em paralelo. No processo filho, que o retorno da função fork() é comparado com zero (como vimos nos conceitos anteriores, o processo filho retorna zero no fork()), será impresso na tela “Eu sou o filho”. No processo pai, o bloco ‘else’ será executado, imprimindo na tela “Eu sou o pai”.
Conclusão
Vimos mais um passo de como funcionam os processos no sistema operacional com base Unix. Vamos continuar avançando e publicando evidências dos estudos!



Nenhum comentário:

Postar um comentário