Função fork
Sintaxe:
#include <unistd.h>
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; }