A função execvp em C

Jinku Hu 12 outubro 2023
  1. Use a função execvp para substituir uma imagem de processo em C
  2. Trate adequadamente os cenários de erro de chamada de função execvp e envie mensagens correspondentes
  3. Use execvp com a função fork para criar um processo filho e executar um programa diferente em C
A função execvp em C

Este artigo irá demonstrar vários métodos sobre como usar a função execvp em C.

Use a função execvp para substituir uma imagem de processo em C

Em sistemas baseados em Unix, há duas chamadas de sistema separadas para criar um novo processo e carregar um novo código de programa em um processo em execução. O último é feito usando a família exec de funções de biblioteca que são apenas interfaces diferentes para a chamada de sistema execve. Existem 6 protótipos de função diferentes: execlp, execle, execv, execvp e execvpe. Essas funções recebem um nome de arquivo ou caminho de um novo arquivo de programa para carregar e executar como o primeiro argumento. execvp também recebe un array de argumentos do programa como o segundo argumento.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  const char *args[] = {"vim", "/home/ben/tmp3.txt", NULL};

  execvp("vim", args);

  exit(EXIT_SUCCESS);
}

Trate adequadamente os cenários de erro de chamada de função execvp e envie mensagens correspondentes

Observe que as funções da família exec só retornam se ocorrer um erro, por isso é importante implementar rotinas de verificação de erros e lidar com os caminhos de código correspondentes conforme necessário.
execvp entre eles retorna -1 em caso de falha, e também define a variável errno. Lembre-se, porém, que errno deve ser explicitamente definido como 0 antes da chamada da função e apenas verificar o valor quando a chamada dada retornar. A função execvp pode receber o nome do arquivo sem barras, o que implica que o arquivo é pesquisado em diretórios conforme especificado pela variável de ambiente PATH.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void) {
  const char *args[] = {"vim", "/home/ben/tmp3.txt", NULL};

  errno = 0;
  if (execvp("vim", args) == -1) {
    if (errno == EACCES)
      printf("[ERROR] permission is denied for a file\n");
    else
      perror("execvp");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}

Use execvp com a função fork para criar um processo filho e executar um programa diferente em C

Alternativamente, suponha que o usuário precise criar um novo processo e executar o código de programa fornecido. Nesse caso, podemos utilizar a chamada de função fork combinada com execvp. fork duplica o processo de chamada e cria um novo chamado - o processo filho. No exemplo a seguir, implementamos um wrapper de função personalizada para criar um novo processo e carregar / executar o código de programa fornecido. Observe que, uma vez que um processo filho é criado, ele executa um código diferente e o processo pai espera até que o filho saia.

#include <errno.h>
#include <stdio.h>
#include <stdlib.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) {
    printf("spawn child with pid - %d\n", ch_pid);
    return ch_pid;
  } else {
    execvp(program, arg_list);
    perror("execve");
    exit(EXIT_FAILURE);
  }
}

int main(void) {
  const char* args[] = {"vim", "/home/ben/tmp3.txt", NULL};

  pid_t child;
  int wstatus;

  child = spawnChild("vim", args);

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

  exit(EXIT_SUCCESS);
}
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