2016-11-14 6 views
0

Ich habe eine Methode execfile, die den Pfad einer ausführbaren Datei nimmt und dann ausführt, ich versuche jetzt, die Option für den Benutzer hinzuzufügen, um Argumente zu dem Befehl, der ausgeführt wird, einzugeben. Ich habe es zur Zeit wie so umgesetzt:Argumente für execv von stdin lesen? (C)

int execfile(char *file) { 
    printf("Enter any arguments to %s: ", file); 

    char *arg = (char *) calloc(ARG_MAX, sizeof(char)); 
    scanf("%s", arg); 

    execl(file, file, arg, NULL); 
    return -1; 
} 

Dies tut Funktion primitiv, dass ich /usr/bin/ps ausführen kann und el oder -el beim Argument Aufforderung eingeben und die Funktion wird mit den beiden Argumenten ausführen, wie beabsichtigt.

Idealerweise wäre es eleganter, Argumente eingeben zu können, wie Sie es normalerweise bei der direkten Ausführung eines C-Programms tun würden. Geben Sie also -e -l an der Eingabeaufforderung ein und lassen Sie es vom Programm richtig interpretieren (derzeit funktioniert das nicht). oder drücken Sie einfach die Eingabetaste, um die Eingabeaufforderung zu überspringen (momentan müssen Sie mindestens ein Zeichen eingeben).

Ich dachte, der beste Weg, dies zu tun wäre, ein Array zu deklarieren char *argv[], arg[0] = file Set dann den Rest der Eingabe scannen und jedes separate Argument in einer Array-Zelle, dann execv(file, argv) aufrufen.

Ich bin jedoch sehr neu in C und bin mir nicht sicher, wie dies auf die effizienteste Art und Weise implementiert werden kann. Ich überlegte zum Beispiel, zuerst die ganze Zeichenfolge zu lesen und dann eine Schleife zu durchlaufen Argumente erkennen, die zu argv hinzugefügt werden, aber es scheint ein bisschen langwierig zu sein? Gibt es keine Möglichkeit, diese Argumente direkt von stdin in das Array zu lesen?

Darüber hinaus bin ich mir nicht sicher, was ich ARG_MAX einstellen soll, da ich nicht weiß, wie hoch die Anzahl der Argumente in C ist, und ich weiß nicht, wie man erkennt, dass die Eingabetaste gedrückt wurde um sofort zu überspringen.

+0

Siehe http://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c und ähnliche Fragen, wie eine Zeichenfolge in ein Array aufteilen. – Barmar

+0

Außerdem sollte 'execl (..., NULL);' 'execl (..., (char *) NULL) sein;' – alk

+0

"* Gibt es keine Möglichkeit, diese Argumente in das Array zu lesen *": This 'char * argv []' definiert kein Array, da es einen unvollständigen Typ hat, da die Anzahl der Elemente nicht zur Kompilierungszeit, nicht direkt oder indirekt über einen Initialisierer angegeben wird. – alk

Antwort

0

Gibt es keine Möglichkeit, diese Argumente direkt von stdin in das Array zu lesen?

In einem Schritt, ohne zu wissen, wie viele Whitespace-getrennte Argument übergeben wird, und ohne zusätzliche Analyse?

Nr