Use a função fork em C

Jinku Hu 12 outubro 2023
  1. Use a função fork para criar um novo processo em C
  2. Use uma das funções exec para executar um novo programa no processo filho em C
Use a função fork em C

Este artigo irá explicar vários métodos de como usar a função fork em C.

Use a função fork para criar um novo processo em C

A função fork é usada para criar um novo processo que representa a duplicação do processo do chamador. Observe que o processo de chamada é convencionalmente chamado de processo pai e recém-criado - processo filho. Embora tenhamos mencionado acima que o processo filho é uma duplicata do pai, existem algumas diferenças, como o processo filho tem seu próprio PID exclusivo (detalhes completos sobre as diferenças estão listados no manual fork página).

No exemplo a seguir, implementamos um cenário simples onde fork é usado para executar dois processos simultaneamente. A primeira instrução if verifica se um código de erro é retornado e continua somente se o fork foi bem-sucedido. A próxima instrução if demonstra como estruturar o código a ser executado por processos simultâneos.

A chamada fork é um pouco exclusiva em comparação com outras funções, pois retorna duas vezes quando bem-sucedida - no processo pai e no filho - retornando o PID do processo filho no pai e o valor 0 no filho. Observe que especificamos as condições do loop de acordo para distinguir diferentes caminhos de código para processos.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void) {
  pid_t c_pid = fork();
  if (c_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (c_pid == 0) {
    printf("printed from child process - %d\n", getpid());
    exit(EXIT_SUCCESS);
  } else {
    printf("printed from parent process - %d\n", getpid());
    wait(NULL);
  }

  exit(EXIT_SUCCESS);
}

Resultado:

printed from parent process - 8485
printed from child process - 8486

Use uma das funções exec para executar um novo programa no processo filho em C

Um dos casos comuns para usar a função fork é executar um novo programa no processo filho, o que pode ser realizado adicionando uma das funções exec à mistura. Neste caso, implementamos uma função separada chamada spawnChild que cria um novo processo e então chama execvp para executar o programa fornecido. Escolhemos um programa de linha de comando amplamente disponível - top para executar no processo filho. Observe que o processo pai pode escolher esperar pelas mudanças de estado do processo filho usando waitpid.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>

pid_t spawnChild(const char* program, char** arg_list) {
  pid_t ch_pid = fork();
  if (ch_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (ch_pid == 0) {
    execvp(program, arg_list);
    perror("execve");
    exit(EXIT_FAILURE);
  } else {
    printf("spawned child with pid - %d\n", ch_pid);
    return ch_pid;
  }
}

int main(void) {
  int ret;
  const char* args[] = {"top", NULL, NULL};

  pid_t child;
  int wstatus;

  child = spawnChild("top", args);

  if (waitpid(child, &wstatus, WUNTRACED | WCONTINUED) == -1) {
    perror("waitpid");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}

Resultado:

printed from child process - 8486
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C Process