Ferramentas do usuário

Ferramentas do site


fork

Função fork

Sintaxe:

#include <unistd.h>

pid_t fork(void);


A função fork é uma função que duplica o processo atual dentro do sistema operacional. O processo que inicialmente chamou a função fork é chamado de processo pai. O novo processo criado pela função fork é chamado de processo filho. Todas as áreas do processo são duplicadas dentro do sistema operacional (código, dados, pilha, memória dinâmica).

A função fork é chamada uma única vez (no pai) e retorna duas vezes (uma no processo pai e outra no processo filho). O processo filho herda informações do processo pai:

  • Usuários (user id) Real, efetivo.
  • Grupos (group id) Real, efetivo.
  • Variáveis de ambiente.
  • Descritores de arquivos.
  • Prioridade
  • Todos os segmentos de memória compartilhada assinalados.
  • Diretório corrente de trabalho.
  • Diretório Raiz.
  • Máscara de criação de arquivos.

O processo filho possui as seguinte informações diferente do processo pai:

  • PID único dentro do sistema.
  • Um PPID diferente. (O PPID do processo filho é o PID do processo pai que inicialmente ativou a função fork).
  • O conjunto de sinais pendentes para o processo é inicializado como estando vazio.
  • Locks de processo, código e dados não são herdados pelo processo filho.
  • Os valores da contabilização do processo obtida pela função time são inicializados com zero.
  • Todos os sinais de tempo são desligados.

Caso a função fork retorne 0 (zero), está se executando o processo filho. Caso a função retorne um valor diferente de 0 (zero), mas positivo, o processo pai está sendo executado. O valor retornado representa o PID do processo filho criado. A função retorna -1 em caso de erro (provavelmente devido a se ter atingido o limite máximo de processos por usuário configurado no sistema).

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
 
int main(int argc, char  *argv[])
{
   pid_t iPid;
 
   printf("\nDuplicando o processo\n");
 
   iPid = fork();
   if (iPid < 0)
   {
      perror(argv[0]);
      exit(errno);
   }
 
   if(iPid != 0)
   {
      /* este trecho de código será executado apenas no pai */
      printf("\nCodigo executado no processo pai\n");
      printf("\nPAI -Processo pai.  PID:|%d|\n", getpid());
      printf("\nPAI -Processo filho.PID:|%d|\n", iPid);
   }
   else
   {
      printf("\nCódigo executado pelo filho");
   }
 
   /* este trecho de código será executado apenas no filho, embora o comando if esteja disponível também para o pai */
   if(iPid == 0)
   {
      printf("\nCodigo executado no processo filho\n");
      printf("\nFILHO-Processo pai.  PID:|%d|\n",getppid());
      printf("\nFILHO-Processo filho.PID:|%d|\n",getpid());
   }
   else
   {
      printf("\nCódigo executado pelo pai");
   }
 
   /* este código está disponível no pai e no filho */
   printf("\nEste mensagem será impressa 2 vezes");
   return 0;
}
fork.txt · Última modificação: 2023/09/12 16:14 por 127.0.0.1