Come utilizzare execvp()

L’utente dovrà leggere una riga e manterrò la prima parola come un comando per execvp.

Permette di dire che lui sarà di tipo “gatto file.txt” … comando ” cat . Ma io non sono sicuro di come utilizzare questo execvp(), ho letto alcuni tutorial ma ancora non ho avuto.

#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;
}
Cosa vuoi dire che non capisco? Vi prego di essere più specifico.
Non so quali sono gli argomenti che ho bisogno di passare in execvp.

OriginaleL’autore Axl | 2014-12-18

One Reply
  1. 24

    Il primo argomento è il file che si desidera eseguire, e il secondo parametro è un array di stringhe con terminazione null che rappresentano gli argomenti appropriati per il file come specificato in la pagina man.

    Per esempio:

    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
    Questo codice un pò funziona, ma come faccio che argv contiene il resto della linea, dopo cmd ? let’s dire im suddivisione in token come questo : puntatore = strtok(buf, ” “); if(puntatore != NULL){ strcpy(comando, puntatore); } puntatore = strtok(NULL, ” “); if(puntatore != NULL){ strcpy(nome, puntatore); } posso fare charargv[3] = {nome,”\0″};execvp(comando, nome); ?
    non sono sicuro di quello che stai chiedendo. È una questione a parte?
    Penso di vedere ora – si sta cercando di fare una shell, presumo? Basta scrivere una funzione che divide la stringa DOPO prendere tutto come input dell’utente. Quindi, se l’utente immette “ls-la”, scrivere una funzione che prende che divide la stringa di spazio, e quindi imposta cmd = split[0], argv[0] = split[0], argv[1] = split[2], argv[3] = NULL in modo appropriato. Fa che aiutare?
    Funziona alla grande ! Grazie !
    Un piccolo errore di battitura fix per array di char pointer di inizializzazione: linea 1 dovrebbe essere : char *cmd = “ls”;

    OriginaleL’autore Ricky Mutschlechner

Lascia un commento