Anzahl der Parameter bei Konsolenanwendung

Hallo ersteinmal,

ich habe eine Konsolenanwendung geschrieben. Diese Anwendung führt eine Funktion auf Dateien aus (Archivierung).
Meine Konsolenanwendung wird regelmäßig aus einem GUI aufgerufen (Timer).
Leider kommt es momentan zu Abstürzen im GUI. Wie dem auch sei.
Öffnet man das GUI wieder, werden die zu archivierenden Dateien ermittelt und der Konsolenanwendung übergeben.
Soweit so gut.
Leider stürzte mein Konsolenprogramm immer ab.
Ich habe dann herausgefunden, dass die Länge der Parameter (oder Argumente) für die Konsolenanwendung begrenzt ist.
Bei mir waren es über 1000 Dateinamen inklusive Pfadstruktur.

Daher meine Frage, wie lang darf die Parameterliste für eine Konsolenanwendung sein?
Ist es Betriebssystemabhängig?

Danke für Antworten.

Hallo,
Um diese Abstürze zu vermeiden würde ich vorschlagen, das du kein neues Konsolenprogramm aufrufst, damit übergibst du die Werte als „Call by Value“. Das ist ziemlich enorm bei den Daten die du da überträgst
und erklärt sicherlich auch deine Abstürze.
Um was handelt es sich bei deiner GUI? MFC, Win32,… ?
Gruß Rico

Danke für die Antwort.
Ich glaube nicht, dass es hier darauf ankommt, womit die GUI gemacht ist (ist aber MFC).
Wenn ich die Funktion aus einer dll aufrufe, dann bekomme ich keine Abstürze. Das weiß ich, habe ich auch getestet.
Das Problem tritt auf, wenn ich versuche die Funktionalität als Konsolenanwendung zu starten (Ja, ich habe die Funktionalität angepasst).
Es scheint so zu sein, dass die Anzahl der Zeichen in der Argumentenliste begrenzt ist.
Beispiel:
‚meinprog.exe c:/tmp/dat1.txt c:/tmp/dat2.txt … c:/tmp/dat1216.txt‘
Dies ist nur ein Beispiel. Die Dateinamen sind länger und es sind wirklich über 1000. Ich kann natürlich auch alle Argumente in eine Datei schreiben und die Konsolenanwendung diese Datei dann einlesen lassen. Kein Problem, habe ich getestet, funktioniert.

Es ist einfach das Interesse bei mir, wie lang die Argumentenliste bei einer Konsolenanwendung sein darf.

Ich kann mir natürlich auch ein Programm schreiben, welches mir das austestet, da habe ich aber keine Lust und keine Zeit zu.

Daher habe ich gehofft hier eine Antwort zu finden.

Ich benutze übrigens eine Konsolenanwendung, weil es so vorgegeben ist.

direkt zu deiner frage:
bei der argumentenliste handelt es sich ja um zeiger,
eigentlich dürftest du so viel übergeben wie du gern möchtest (bzw. wie du speicher verfügbar hast :wink: ) oder du hast so viele werte das du argc (int 32 Bit) übersschreitest

allerdings finde ich, das es bei der übergabe von so vielen werten sich nicht mehr um eine saubere programmierung handelt

du schreibst ja, das du das ganze über eine konsolenanwendung realisieren musst, daher empfehle ich dir das ganze, wie du selbst schon schreibst alles in ne datei zu packen und anschließend wieder auslesen
oder halt gleich das ganze über die gui realisieren

direkt zu deiner frage:
bei der argumentenliste handelt es sich ja um zeiger,
eigentlich dürftest du so viel übergeben wie du gern möchtest
(bzw. wie du speicher verfügbar hast :wink: ) oder du hast so
viele werte das du argc (int 32 Bit) übersschreitest

Das ist leider falsch. Es werden von Betriebssystemseite Limits bezüglich der Länge der Kommandozeile gesetzt (ein Googletreffer sagt mir, dass es bei Microsoft-Betriebssytemen wohl je nach Variante un Art des Aufrufs zwischen 2k und 32k sind). Auch POSIX sieht Limits vor.

Deshalb ist es tatsächlich ganz gut, allzulange Kommandozeilen zu vermeiden. Die üblichen Alternativen sind, das Programm einfach einmal pro Datei zu starten (Standardlösung bei großen Dateizahlen in der UNIX-Shell: ls | while read a; do $a; done) oder die Daten auf andere Art hineinzubefördern. Also tatsächlich über eine Datei, oder (was fürs Dateisystem sauberer ist) über stdin (jede eingegebene Zeile ist ein Dateiname).

Oder wenn man Herr des Codes ist: man spaltet das Kommandozeilenprogramm in ein Kommandozeilen-„Interface“ und eine Bibliothek auf, so dass der gleiche Code sowohl von der Kommandozeilenanwendung aus verwendet werden kann als auch von anderen Programmen, die die Bibliothek einbinden.

Viele Grüße,
Sebastian

Hallo Fragewurm,

Daher meine Frage, wie lang darf die Parameterliste für eine
Konsolenanwendung sein?
Ist es Betriebssystemabhängig?

Hängt vom Betriebssystem und vom Compiler ab.

Das Betriebssystem muss die Zeile Parsen und irgendwo in den Speicher packen.

CSTARTUP übernimmt den ganzen Kram und gibt ihn dann an Main() weiter.

MfG Peter(TOO)

Hallo Peter(TOO),

vielen Dank für die Antwort. Das habe ich mir gedacht.

Gibt es denn irgendwo die Möglichkeit diese Grenze mal nachzuschauen?
Man sollte sie nicht ausreizen, aber es ist schon mal interessant zu wissen wo diese Grenze ist.

MfG,
Stefan

Hallo Stefan,

Gibt es denn irgendwo die Möglichkeit diese Grenze mal
nachzuschauen?

Muss irgendwo in den Tiefen der Dokumentation zum Betriebssystem und der Compilerimplenetierung zu finden sein.

MfG Peter(TOO)