Ferramentas do usuário

Ferramentas do site


fork
no way to compare when less than two revisions

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.


fork [2023/09/12 16:14] (atual) – criada - edição externa 127.0.0.1
Linha 1: Linha 1:
 +====== Função fork ======
 +
 +Sintaxe:
 +
 + ''#include <unistd.h>''
 +
 +
 +''[[tipos_dados|pid_t]] fork([[tipos_dados|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).
 +
 +<code c>
 +#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;
 +}
 +</code>
 +
 +
  
fork.txt · Última modificação: 2023/09/12 16:14 por 127.0.0.1