Fig 1: Fluxo de trabalho fork () básico
Neste artigo, vou mostrar como usar a chamada de sistema fork () para criar processos filho em C. Então vamos começar.
fork () Sintaxe e valor de retorno:
A sintaxe da função do sistema fork () é a seguinte:
pid_t fork (vazio);A função do sistema fork () não aceita nenhum argumento. Ele retorna um inteiro do tipo pid_t.
Em caso de sucesso, fork () retorna o PID do processo filho que é maior que 0. Dentro do processo filho, o valor de retorno é 0. Se fork () falhar, ele retornará -1.
Bifurcação simples () Exemplo:
Um exemplo simples fork () é fornecido abaixo:
#incluir#incluir
#incluir
#incluir
#incluir
int main (void)
pid_t pid = fork ();
if (pid == 0)
printf ("Criança => PPID:% d PID:% d \ n", getppid (), getpid ());
sair (EXIT_SUCCESS);
else if (pid> 0)
printf ("Pai => PID:% d \ n", getpid ());
printf ("Esperando que o processo filho termine.\ n ");
esperar (NULL);
printf ("Processo filho terminado.\ n ");
senão
printf ("Incapaz de criar o processo filho.\ n ");
return EXIT_SUCCESS;
Aqui, usei fork () para criar um processo filho a partir do processo principal / pai. Em seguida, imprimi o PID (ID do processo) e o PPID (ID do processo pai) do filho e do processo pai. No processo pai, esperar (NULL) é usado para esperar que o processo filho termine. No processo filho, exit () é usado para finalizar o processo filho. Como você pode ver, o PID do processo pai é o PPID do processo filho. Então, o processo filho 24738 pertence ao processo pai 24731.
Você também pode usar funções para tornar seu programa mais modular. Aqui eu usei processTask () e parentTask () funções para os processos filho e pai, respectivamente. É assim que fork () é realmente usado.
#incluir#incluir
#incluir
#incluir
#incluir
void childTask ()
printf ("Olá, mundo \ n");
void parentTask ()
printf ("Tarefa principal.\ n ");
int main (void)
pid_t pid = fork ();
if (pid == 0)
childTask ();
sair (EXIT_SUCCESS);
else if (pid> 0)
esperar (NULL);
parentTask ();
senão
printf ("Nãoépossível criar um processo filho.");
return EXIT_SUCCESS;
O resultado do programa acima:
Executando vários processos filho usando fork () e Loop:
Você também pode usar o loop para criar quantos processos filhos forem necessários. No exemplo abaixo, criei 5 processos filho usando o loop for. Eu também imprimi o PID e PPID dos processos filhos.
#incluir#incluir
#incluir
#incluir
#incluir
int main (void)
para (int i = 1; i <= 5; i++)
pid_t pid = fork ();
if (pid == 0)
printf ("Processo filho => PPID =% d, PID =% d \ n", getppid (), getpid ());
saída (0);
senão
printf ("Processo pai => PID =% d \ n", getpid ());
printf ("Esperando que os processos filho terminem ... \ n");
esperar (NULL);
printf ("processo filho terminado.\ n ");
return EXIT_SUCCESS;
Como você pode ver, o ID do processo pai é o mesmo em todos os processos filho. Então, todos eles pertencem ao mesmo pai. Eles também executam de forma linear. Um após o outro. Controlar processos filhos é uma tarefa sofisticada. Se você aprender mais sobre a programação do sistema Linux e como ela funciona, poderá controlar o fluxo desses processos da maneira que desejar.
Exemplo da vida real:
Diferentes cálculos matemáticos complexos, como md5, sha256 etc., a geração de hash requer muito poder de processamento. Em vez de computar coisas assim no mesmo processo do programa principal, você pode simplesmente calcular o hash em um processo filho e retornar o hash ao processo principal.
No exemplo a seguir, gerei um código PIN de 4 dígitos em um processo filho e o enviei para o processo pai, o programa principal. Então, imprimi o código PIN de lá.
#incluir#incluir
#incluir
#incluir
#incluir
int getPIN ()
// use PPID e PID como semente
srand (getpid () + getppid ());
segredo interno = 1000 + rand ()% 9000;
segredo de retorno;
int main (void)
int fd [2];
tubo (fd);
pid_t pid = fork ();
if (pid> 0)
fechar (0);
fechar (fd [1]);
dup (fd [0]);
int secretNumber;
size_t readBytes = read (fd [0], & secretNumber, sizeof (secretNumber));
printf ("Aguardando PIN… \ n");
esperar (NULL);
printf ("Bytes lidos:% ld \ n", readBytes);
printf ("PIN:% d \ n", secretNumber);
else if (pid == 0)
fechar (1);
fechar (fd [0]);
dup (fd [1]);
segredo interno = getPIN ();
escrever (fd [1], & secret, sizeof (secreto));
sair (EXIT_SUCCESS);
return EXIT_SUCCESS;
Como você pode ver, cada vez que executo o programa, recebo um código PIN de 4 dígitos diferente.
Então, é basicamente assim que você usa a chamada de sistema fork () no Linux. Obrigado por ler este artigo.