Cómo usar execvp()

3 minutos de lectura

avatar de usuario
axel

El usuario leerá una línea y yo retendré la primera palabra como comando para execvp.

Digamos que escribirá “archivo gato.txt” … el mando será cat . Pero no estoy seguro de cómo usar esto execvp()leí algunos tutoriales pero todavía no lo entendí.

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

int main()
{
    char *buf;
    char command[32];
    char name[32];
    char *pointer;
    char line[80];
    printf(">");

    while((buf = readline(""))!=NULL){   
        if (strcmp(buf,"exit")==0)
        break;

        if(buf[0]!=NULL)
        add_history(buf);

        pointer = strtok(buf, " ");
        if(pointer != NULL){
            strcpy(command, pointer);
        }

        pid_t pid;

        int  status;

        if ((pid = fork()) < 0) {     
            printf("*** ERROR: forking child process failed\n");
            exit(1);
        }
        else if (pid == 0) {          
            if (execvp(command, buf) < 0) {     
                printf("*** ERROR: exec failed\n");
                exit(1);
            }
        }
        else                                  
        while (wait(&status) != pid)       
            ;
        free(buf);
        printf(">");
    }///end While
    return 0;
}

  • ¿Qué quieres decir con que no lo entiendes? Por favor sé más específico.

    – SSC

    18 de diciembre de 2014 a las 8:23

  • No sé qué argumentos necesito pasar en execvp.

    – Axel

    18 de diciembre de 2014 a las 8:26

avatar de usuario
Ricky Mutschlechner

El primer argumento es el archivo que desea ejecutar y el segundo argumento es una matriz de cadenas terminadas en nulo que representan los argumentos apropiados para el archivo como se especifica en la página de manual.

Por ejemplo:

char *cmd = "ls";
char *argv[3];
argv[0] = "ls";
argv[1] = "-la";
argv[2] = NULL;

execvp(cmd, argv); //This will run "ls -la" as if it were a command

  • Este código funciona un poco, pero ¿cómo lo hago? argv contiene el resto de la línea, después de cmd? digamos que lo estoy dividiendo en tokens como este: pointer = strtok(buf, ” “); if(puntero!= NULL){ strcpy(comando, puntero); } puntero = strtok(NULL, ” “); if(puntero!= NULL){ strcpy(nombre, puntero); } ¿Puedo hacer char?argv[3] = {nombre,”\0″};execvp(comando, nombre); ?

    – Axel

    18 de diciembre de 2014 a las 8:34


  • @Axl no estoy seguro de lo que estás preguntando. es una pregunta aparte?

    –Ricky Mutschlechner

    18 de diciembre de 2014 a las 8:37

  • @Axl Creo que ahora veo: ¿estás tratando de hacer un caparazón, supongo? Simplemente escriba una función que divida la cadena DESPUÉS de tomarlo todo como entrada del usuario. Entonces, si el usuario ingresa “ls -la”, escriba una función que tome eso, divida la cadena por espacio y luego establezca cmd = split[0]argv[0] = dividir[0]argv[1] = dividir[2]y argv[3] = NULL apropiadamente. ¿Eso ayuda?

    –Ricky Mutschlechner

    18 de diciembre de 2014 a las 8:38

  • No, está en mi código, pero no lo publiqué porque pensé que no era importante. Estoy separando “buf” en tokens, la primera parte es el comando y la siguiente es el argumento. Mi pregunta es: ¿No puedo agregar en su *argv solo el token para el argumento, por lo que no necesito almacenar manualmente todos los argumentos posibles en argv?

    – Axel

    18 de diciembre de 2014 a las 8:39

  • Solo una pequeña corrección de error tipográfico para la inicialización del puntero de matriz de caracteres: la línea 1 debe ser: char *cmd = “ls”;

    – Aditya Gaykar

    7 de octubre de 2015 a las 9:26


En cpp, debe prestar especial atención a los tipos de cadena al usar execvp:

#include <iostream>
#include <string>
#include <cstring>
#include <stdio.h>
#include <unistd.h>
using namespace std;

const size_t MAX_ARGC = 15; // 1 command + # of arguments
char* argv[MAX_ARGC + 1]; // Needs +1 because of the null terminator at the end
// c_str() converts string to const char*, strdup converts const char* to char*
argv[0] = strdup(command.c_str());

// start filling up the arguments after the first command
size_t arg_i = 1;
while (cin && arg_i < MAX_ARGC) {
    string arg;
    cin >> arg;
    if (arg.empty()) {
        argv[arg_i] = nullptr;
        break;
    } else {
        argv[arg_i] = strdup(arg.c_str());
    }
    ++arg_i;
}

// Run the command with arguments
if (execvp(command.c_str(), argv) == -1) {
    // Print error if command not found
    cerr << "command '" << command << "' not found\n";
}

Referencia:
exclp, execvp用法與範例

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad