A função execvp em C
-
Use a função
execvp
para substituir uma imagem de processo em C -
Trate adequadamente os cenários de erro de chamada de função
execvp
e envie mensagens correspondentes -
Use
execvp
com a funçãofork
para criar um processo filho e executar um programa diferente 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);
}
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