Use a função fork em C
-
Use a função
fork
para criar um novo processo em C -
Use uma das funções
exec
para executar um novo programa no processo filho 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
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