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:

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

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