La función execvp en C
-
Usar la función
execvp
para reemplazar la imagen de un proceso en C -
Maneje adecuadamente los escenarios de error de la llamada a la función
execvp
y emita los mensajes correspondientes -
Utilice
execvp
con la funciónfork
para crear un proceso hijo y ejecutar un programa diferente en C
Este artículo demostrará múltiples métodos sobre cómo utilizar la función execvp
en C.
Usar la función execvp
para reemplazar la imagen de un proceso en C
En los sistemas basados en Unix, hay dos llamadas al sistema separadas para crear un nuevo proceso y para cargar un nuevo código de programa en un proceso en ejecución. Esto último se hace utilizando la familia de funciones de la biblioteca exec
que no son más que diferentes interfaces de la llamada al sistema execve
. Hay 6 prototipos de funciones diferentes: execlp
, execle
, execv
, execvp
y execvpe
. Estas funciones toman como primer argumento un nombre de archivo o una ruta de un nuevo archivo de programa para cargar y ejecutar. execvp
también toma un array de argumentos de programa como 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);
}
Maneje adecuadamente los escenarios de error de la llamada a la función execvp
y emita los mensajes correspondientes
Tenga en cuenta que, las funciones de la familia exec
sólo devuelven si se produce un error, por lo que es importante implementar rutinas de comprobación de errores y manejar las rutas de código correspondientes según sea necesario.
Entre ellas, execvp
devuelve -1
en caso de fallo, y también establece la variable errno
. Tenga en cuenta, sin embargo, que errno
debe establecerse explícitamente a 0 antes de la llamada a la función y sólo comprobar el valor una vez que la llamada dada regrese. La función execvp
puede tomar un nombre de fichero sin barras, lo que implica que el fichero se busca en los directorios especificados por la variable de entorno 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);
}
Utilice execvp
con la función fork
para crear un proceso hijo y ejecutar un programa diferente en C
Alternativamente, supongamos que el usuario necesita crear un nuevo proceso y ejecutar el código del programa dado. En ese caso, podemos utilizar la llamada a la función fork
combinada con execvp
. La función fork
duplica el proceso que llama y crea uno nuevo llamado - el proceso hijo. En el siguiente ejemplo, implementamos una función personalizada para crear un nuevo proceso y cargar/ejecutar el código del programa dado. Observe que una vez que el proceso hijo es creado, ejecuta un código diferente y el proceso padre espera hasta que el hijo salga.
#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