Programação C

Chamada do sistema Fork em C

Chamada do sistema Fork em C
A chamada de sistema fork () é usada para criar processos filhos em um programa C. fork () é usado onde o processamento paralelo é necessário em seu aplicativo. A função do sistema fork () é definida nos cabeçalhos sys / tipos.h e unistd.h. Em um programa onde você usa fork, você também tem que usar a chamada de sistema wait (). A chamada de sistema wait () é usada para esperar no processo pai até que o processo filho termine. Para terminar um processo filho, a chamada de sistema exit () é usada no processo filho. A função wait () é definida no cabeçalho sys / espere.h e a função exit () é definida no cabeçalho stdlib.h.

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.

Como capturar e transmitir sua sessão de jogo no Linux
No passado, jogar era considerado apenas um hobby, mas com o tempo a indústria de jogos viu um grande crescimento em termos de tecnologia e número de ...
Melhores jogos para jogar com rastreamento manual
Oculus Quest introduziu recentemente a grande ideia de rastreamento manual sem controladores. Com um número cada vez maior de jogos e atividades que e...
Como mostrar a sobreposição de OSD em aplicativos e jogos Linux em tela cheia
Jogar jogos em tela cheia ou usar aplicativos em modo de tela cheia sem distração pode cortar você das informações relevantes do sistema visíveis em u...