Übergeben eines Arrays an execvp () von der Benutzereingabe

8

Ich versuche, vom Benutzer eingegebene Argumente an execvp() zu übergeben.

Bisher habe ich die Saite aufgeteilt. Wenn der Benutzer ls -a eingibt, wird temp als "ls" und "-a" gefolgt von einem NULL-Zeichen gespeichert. Ich bin mir nicht sicher, wie ich in execvp richtig darauf zeigen soll. In Beispielen habe ich es mit execvp(temp[position], temp) gesehen. Ich weiß, dass die Art, wie ich es versuche, im Moment falsch ist, aber ich bin nicht sicher, wie ich es richtig machen soll! Im Moment bekomme ich einen Segmentierungsfehler.

%Vor%     
caerulean 21.03.2013, 04:47
quelle

3 Antworten

6

Dein Problem ist, dass temp ein einzelner Zeiger ist und du ein Array von Zeigern an execvp() übergeben musst.

Etwas wie:

%Vor%

Beachten Sie, dass der Argumentliste ein Nullzeiger als Terminator zugewiesen wurde, genau wie argv[argc] == NULL in main() . Klar, ich habe die Fehlerüberprüfung übersprungen (wenn Sie mehr als 63 Argumente übergeben, werden Sie args array überlaufen). Aber das beinhaltet die Kernidee.

  

In diesem Beispiel scheint der einfache Befehl ls nicht funktionieren zu können. Ich habe mkdir und echo ausprobiert und sie scheinen gut zu funktionieren. Die Übergabe von ls ergibt -1 von execvp() .

Ich bin nicht sicher, was das Problem sein könnte - all das funktioniert für mich:

  • ls
  • ls -l
  • ls -l madump.c (wobei madump.c zufällig eine Datei in dem Verzeichnis ist, in dem ich gerade teste)

Der Code, den ich verwendet habe, war:

%Vor%

Beachten Sie, dass ich \n zur Liste strtok() token hinzugefügt habe, nachdem ich ein Verzeichnis mit einem Zeilenumbruch am Ende seines Namens erstellt habe. Gut für nervige Freunde und verwirrende, halb gebildete Gegner, aber ein Ärgernis für die meisten anderen Perspektiven. Beachten Sie, wie ich die Daten, die an execvp() übergeben werden, vor der eigentlichen Ausgabe ausdrucken werde. Oft verwende ich printf("<<%s>>\n", *next); anstatt nur puts() , um eine eindeutige Angabe darüber zu erhalten, wo die Argumente beginnen und enden.

Die Ausgabe des Befehls ( doit ) war:

%Vor%

Was haben Sie von Ihrer Version bekommen?

    
Jonathan Leffler 21.03.2013, 05:04
quelle
2

Wie Ihr Code derzeit aussieht, wird while(temp != NULL) nach dem Beenden von temp NULL sein!

execvp erwartet, dass das erste Argument der Pfad der Datei ist, die das neue Prozessabbild darstellt. Das zweite -Argument wird voraussichtlich ein Array mit NULL-terminierten Strings sein, wobei das letzte Mitglied dieses Arrays ein NULL-Zeiger und das erste Mitglied der Dateiname der im ersten Argument angegebenen Datei ist.

Um dies in Ihrem Code zu implementieren, betrachten Sie stattdessen die folgende while -Schleife:

%Vor%

Der Code, den ich oben zur Verfügung gestellt habe, führt keine Fehlerprüfung durch (zB wenn realloc oder malloc fehlschlägt), aber beachte grundsätzlich diese Punkte:

  1. Argument 1: Pfadname der Datei, die gespeichert werden soll.
  2. Argument 2: Eine Liste von Argumenten, bei denen das erste Mitglied dieser Liste = Dateiname ist, letztes Mitglied = NULL-Zeiger.

Bitte schauen Sie sich die Dokumentation zur besseren Übersichtlichkeit und ein sehr einfaches Beispiel an.

>     
Anish Ramaswamy 21.03.2013 04:57
quelle
1

Ich nehme an, der segfault ist, weil Sie einen Nullzeiger an execvp übergeben. Die Schleife unmittelbar über dem Anruf stellt dies sicher.

Um das zu tun, was Sie tun möchten, müssen Sie ein Array von String-Zeigern für das erstellen, was Sie aktuell temp genannt haben. Dies wird zum Array argv für das aufgerufene Programm. Deshalb wird der Befehl normalerweise als execvp (temp[0], temp) verwendet - argv[0] ist normalerweise der Name des Programms.

Versuchen Sie also, ein Array von String-Zeigern zu erstellen, und weisen Sie jeweils auf ein in Token umgewandeltes Wort von line hin. Möglicherweise müssen Sie malloc verwenden. Wenn Sie jedoch clever sein möchten, können Sie direkt auf line zeigen. Wenn Sie das tun, müssen Sie das Zeichen unmittelbar nach jedem Wort auf %code% setzen.

    
lxop 21.03.2013 04:56
quelle

Tags und Links