Fork me!

Um dos recursos próprios dos Unixes é a capacidade de criar um novo processo baseado na execução de um proceso pai. Ou seja, usar um garfo… A analogia é relacionada ao fluxo do processo. A partir do momento da execução da função fork(), o processo se divide em dois e o processo filho herda quase tudo do seu pai.

É uma maneira simples e eficiente de criar aplicações multiprocessadas (o Apache, por exemplo, por padrão, usa esse recurso). Mas é um tanto estranho para alguém que tenha vindo do mundo da Microsoft, onde o fork() não existe. O Windows é fortemente baseado em threads, não em processos. De fato, processos, no Windows, são recursos caros, pouco performáticos se usados como base para o multiprocessamento. Nos Unixes isso é padrão.

A função fork() retorna um valor inteiro correspondente à identidade do processo (pid = process identification). No processo filho fork() retorna 0, no processo pai fork() retorna o PID do filho. No processo pai fork() pode retornar -1, indicando que não foi possível forkar. Neste caso, o pai pode seguir seu curso e o filho sequer nascerá. Eis um exemplo simples de uso da função:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
  pid_t pid;

  /* ... faz inicializações aqui.. */

  switch (pid = fork())
  {
  case -1:
    fprintf(stderr, "Parent: Fuck! it didn't forked!\n");
    return 1;
  case 0:
    fprintf(stderr, "Hello! I'm the child process!\n");
    break; 
  default:
    fprintf(stderr, "Hello! I'm the parent process\n"
                    "My child PID is %d.\n", pid);
    break;
  }

  /* Ambos o pai e o filho executarão deste ponto para frente. */

  return 0;
}

Reparem como é simples… Quase todos os recursos do processo pai são herdados pelo filho, incluindo arquivos abertos, memória alocada, etc… No entanto, uma vez que um novo processo foi criado, cada um segue o seu caminho (ou seja, os recursos não são compartilhados, eles são herdados). Existem, é claro, algumas restrições. Dêem uma olhada na manpage:

$ man fork

De maneira geral, fork é uma excelente ferramenta nos Unixes. Pena que não exista no mundo de Bill…

Anúncios

Um comentário sobre “Fork me!

  1. Eu não diria que o fork é “uma ferramenta”, mas sim a “essência” do sistema operacional.
    Tudo no unix existe em função de forks que é, na realidade, o mecanismo que o sistema se utiliza para a criar novos processos. Na realidade a “concha” onde o seu “programa” roda é fruto de um processo predecessor que “forkou” e todos os “processos” existentes são frutos do primordial “init”, com atenção muito especial para o detalhe do “boot” versus “boot load”, é bem sutil.
    Andei revisando isto quando estava lendo sobre o minix recentemente. O conceito é muitíssimo bem explicado pelo Sr. AST. (Andrew S. Turnebaum)
    Recomendo seriamente a leitura do livro dele antes de sequer olhar para um teclado diante de uma console unix. O sr. Torvalds fez isto.
    É uma pena que ninguém tenha me dado esta recomendação há uns 15 anos.
    Outra coisa que me chamou a atenção na semana passada: no mundo do Sr. Gates, existe um ambiente que pode ajudar os “aleijadinhos” do mundo windows: interix. Visite o site da comunidade e veja que os SUA e SFU podem fazer pelo “problema windows” usando unix, é bem interessante.

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s