Con execvp, un programa puede iniciar comandos del sistema como iniciar apli­ca­cio­nes o ejecutar servicios del sistema. En co­m­bi­na­ción con la función fork(), también se puede llamar a código después de execvp.

¿Cómo funciona execvp?

La principal tarea de execvp es tra­n­s­fe­rir el control de un programa a otro sin reiniciar todo el proceso. Esto permite cambiar sin problemas entre di­fe­re­n­tes funciones o efectuar comandos externos con ar­gu­me­n­tos variables. execvp es como un director invisible que cambia los es­ce­na­rios y salta entre di­fe­re­n­tes líneas ar­gu­me­n­ta­les.

Gracias a la ejecución dinámica de procesos, puedes ajustar la ruta al programa e incluso sus ar­gu­me­n­tos durante la ejecución. La función execvp() se utiliza en llamadas al sistema que requieren tareas complejas como la ejecución de scripts, comandos del sistema, pi­pe­li­ni­ng y re­di­re­c­cio­nes. Además, co­n­tri­bu­ye si­g­ni­fi­ca­ti­va­me­n­te a aumentar la fle­xi­bi­li­dad de los programas en C.

La sintaxis básica de execvp

La sintaxis de execvp requiere la ruta del archivo o el nombre del programa a ejecutar y un arreglo de cadenas que contenga los ar­gu­me­n­tos para dicho programa.

#include <unistd.h> 
 
int execvp(const char *command, char* argv[]);
c
  • const char *command: esta es la ruta de archivo o el nombre del programa re­s­pe­c­ti­vo. Puede ser una ruta absoluta o relativa. Cuando se usa una ruta relativa, execvp busca el archivo en el sistema PATH.
  • char *argv[]: arreglo de cadenas de ca­ra­c­te­res que contiene los ar­gu­me­n­tos para el programa a ejecutar; el arreglo debe terminar con un puntero NULL para indicar el final de la lista de ar­gu­me­n­tos. El primer elemento en argv suele ser el nombre del propio programa, seguido de los ar­gu­me­n­tos.

Las funciones execvp y otras funciones de la familia exec son es­pe­cí­fi­cas de los sistemas ope­ra­ti­vos basados en Unix. La in­s­tru­c­ción #include <unistd.h> es un archivo de cabecera en la pro­gra­ma­ción en C. Contiene de­fi­ni­cio­nes y de­cla­ra­cio­nes de funciones que in­ter­ac­túan con el sistema operativo basado en Unix y el control de procesos. Te en­co­n­tra­rás con este archivo fre­cue­n­te­me­n­te al aprender C.

La apli­ca­ción práctica de execvp

En el programa C presente, uti­li­za­mos la función execvp del archivo de en­ca­be­za­do unistd.h para iniciar el programa externo ls con los ar­gu­me­n­tos -l y /usr/bin. El arreglo args re­pre­se­n­ta los ar­gu­me­n­tos del programa. Si la función execvp() tiene éxito, el proceso actual será re­em­pla­za­do por el programa externo, y las líneas si­guie­n­tes serán ignoradas. En caso de error, aparecerá un mensaje de error a través de perror, y el programa devolverá el código de estado 1.

#include <unistd.h> 
 
int main() { 
    char *args[] = {"ls", "-l", "/usr/bin", NULL}; 
 
    execvp("ls", args); 
 
    perror("execvp"); 
    return 1; 
}
c

Con fork(), también puedes llamar a in­s­tru­c­cio­nes después de execvp(). La función fork() crea un nuevo proceso. Esto significa que el código seguirá eje­cu­tá­n­do­se en el proceso padre, mientras que el nuevo proceso iniciará el programa externo.

#include <stdio.h> 
#include <unistd.h> 
#include <sys/wait.h> 
 
int main() { 
    char* command = "ls"; 
    char *args[] = {"ls", "-l", "/usr/bin", NULL}; 
 
    printf("Before calling execvp()\n"); 
 
    pid_t child_pid = fork(); 
 
    if (child_pid == -1) { 
        // Error creating the process 
        perror("fork"); 
        return 1; 
    } 
 
    if (child_pid == 0) { 
        // Code executed in the child process 
 
        // Call execvp in the child process to execute "ls" with the specified arguments 
        int status_code = execvp(command, args); 
 
        // This line is reached if execvp encounters an error 
        perror("execvp"); 
 
        // Print statement after execvp 
        printf("ls -l /usr/bin has taken control of this child process. If this is printed, execvp encountered 
       an error.\n"); 
 
        // Error handling in the child process 
        return 1; 
 
    } else { 
        // Code executed in the parent process 
 
        // Wait for the completion of the child process 
        waitpid(child_pid, NULL, 0); 
 
        printf("The child process has completed its execution.\n"); 
    } 
 
    return 0; 
}
c

La función execvp() hace que el proceso hijo tome control con ls y sus ar­gu­me­n­tos. Mientras tanto, el proceso padre espera la fi­na­li­za­ción del proceso hijo con waitpid y luego muestra el mensaje.

Hosting
Hosting de primera al mejor precio
  • 3x más rápido, ahora un 60 % de ahorro
  • Alta di­s­po­ni­bi­li­dad >99.99 %
  • Solo en IONOS: hasta 500 GB incluidos
Ir al menú principal