So verwenden Sie execvp()

Lesezeit: 3 Minuten

Benutzer-Avatar
Axl

Der Benutzer liest eine Zeile und i behält das erste Wort als Befehl für execvp bei.

Nehmen wir an, er wird tippen “Katzendatei.txt” … Befehl wird cat sein. Aber ich bin mir nicht sicher, wie ich das verwenden soll execvp()ich habe einige Tutorials gelesen, aber immer noch nicht verstanden.

#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;
}

  • Was heißt du verstehst es nicht? Bitte sei spezifischer.

    – SSC

    18. Dezember 2014 um 8:23 Uhr

  • Ich weiß nicht, welche Argumente ich in execvp übergeben muss.

    – Achsl

    18. Dezember 2014 um 8:26 Uhr

Benutzer-Avatar
Ricky Mutschlechner

Das erste Argument ist die Datei, die Sie ausführen möchten, und das zweite Argument ist ein Array von nullterminierten Zeichenfolgen, die die entsprechenden Argumente für die Datei darstellen, wie in angegeben die Manpage.

Zum Beispiel:

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

  • Dieser Code funktioniert irgendwie, aber wie mache ich das argv enthält den Rest der Zeile, nach cmd ? Sagen wir, ich teile es wie folgt in Token auf: pointer = strtok(buf, ” “); if(pointer != NULL){ strcpy(command, pointer); } Zeiger = strtok(NULL, ” “); if(pointer != NULL){ strcpy(name, pointer); } Kann ich char tunargv[3] = {Name,”\0″};execvp(Befehl, Name); ?

    – Achsl

    18. Dezember 2014 um 8:34 Uhr


  • @Axl nicht sicher, was du fragst. Ist es eine separate Frage?

    – Ricky Mutschlechner

    18. Dezember 2014 um 8:37 Uhr

  • @Axl Ich glaube, ich verstehe jetzt – du versuchst, eine Hülle zu machen, nehme ich an? Schreiben Sie einfach eine Funktion, die die Zeichenfolge aufteilt, NACHDEM Sie alles als Benutzereingabe aufgenommen haben. Wenn der Benutzer also “ls -la” eingibt, schreiben Sie eine Funktion, die dies akzeptiert, die Zeichenfolge durch Leerzeichen teilt und dann cmd = split festlegt[0]argv[0] = aufgeteilt[0]argv[1] = aufgeteilt[2]und argv[3] = NULL entsprechend. Hilft das?

    – Ricky Mutschlechner

    18. Dezember 2014 um 8:38 Uhr

  • Nein, es ist in meinem Code, aber ich habe es nicht gepostet, weil ich dachte, es sei nicht wichtig. Ich trenne “buf” in Tokens, der erste Teil ist der Befehl und der nächste Teil ist das Argument. Meine Frage ist: Kann ich in Ihrem * argv nicht nur das Token für das Argument hinzufügen, damit ich nicht jedes mögliche Argument manuell in argv speichern muss?

    – Achsl

    18. Dezember 2014 um 8:39 Uhr

  • Nur eine kleine Tippfehlerkorrektur für die Initialisierung des char-Array-Zeigers: Zeile 1 sollte lauten: char *cmd = “ls”;

    – Aditya Gaykar

    7. Oktober 2015 um 9:26 Uhr


In cpp müssen Sie bei der Verwendung besonders auf String-Typen achten 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";
}

Bezug:
execlp, execvp用法與範例

1342220cookie-checkSo verwenden Sie execvp()

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy