2010-01-05 5 views
7

Ich frage mich, ob es einige API gibt, um die Befehlszeilenargumente des aktuellen Prozesses unter Linux zu erhalten.Linux-Äquivalent von GetCommandLine und CommandLineToArgv?


Ich denke, ich war furchtbar unklar. Der eigentliche Zweck der Frage bestand darin, Unicode-Dateinamen über Befehlszeilenargumente zu übergeben.

+1

'int main (intargc, char * argv [])', und Sie haben in 'argc' die Anzahl der Argumente, und' argv' ist ein Array von 'char'-Zeigern mit den Argumenten. Dies ist ANSI C, also wird jede portable Implementierung funktionieren. Oder möchten Sie, dass Befehlszeilenoptionen analysiert werden? –

+0

Ich verstehe. Ich war mir des argc argv Paradigmas bewusst. Ich frage mich, wie ich Unicode-Argumente durch argv bekommen konnte. – lyxera

+2

argv wird Ihnen geben, was auch immer die Schale dort hineinlegt; da die Shell es nur als Byte-String behandelt, wird es zurück zum Terminal geschoben. Alle gängigen Terminals sind jetzt Unicode-fähig, also sollte es einfach funktionieren. –

Antwort

9

aus Datei lesen /proc/self/cmdline

Zum Beispiel:

[[email protected] ~]$ od -a /proc/30651/cmdline 
0000000 / u s r / s b i n / h t t p d nul 
0000020 

Oder für eine satisfyingly erfrischende Selbstreferenz:

[[email protected] images]$ od -c /proc/self/cmdline 
0000000 o d \0 - c \0 / p r o c / s e l f 
0000020 / c m d l i n e \0 
0000031 
+1

Seien Sie vorsichtig mit den Nullbytes (0x00), die jedes Token begrenzen. Außerdem wird der Text in/proc/self/cmdline nicht genau dem entsprechen, was der Benutzer eingegeben hat - Anführungszeichen werden entfernt usw. –

+0

Auch darauf achten, dass die '/ proc'-Schnittstelle derzeit nur die erste Seite (4k) anzeigt die Befehlszeile, obwohl es länger sein kann (ich glaube bis zu 32 Seiten). – Jester

3

Kasse Getopt Es ist eine Parsing-Bibliothek Befehlszeile, die sonst in vielen Sprachen, darunter C.

implementiert ist:

int main(int argc, char *argv[]) 

argv ein Array von Argumenten als char* und argc ist die Anzahl der Argumente.

argv[0] ist immer der ausführbare Dateiname selbst.

+0

Sie meinen Getopt? – fennec

+0

ah ja, danke Fennec –

1

Gerade argc und argv verwenden. argv wird in der lokalen Codierung sein (die UTF-8 sein könnte), und von dort können Sie zu wchar_t konvertieren (z. B. über mbtowc).

1

Linux nicht "Unicode-Dateinamen" per se. Alle Dateinamen sind nur zufällige Sequenzen von 8-Bit-Zeichen, soweit es den Kernel betrifft.

Schlimme Dinge können passieren, wie der Benutzer eine Datei schreiben kann und dann ihr Gebietsschema ändert, wobei ihr Dateiname im vorherigen Gebietsschema codiert bleibt. Wenn Sie also einen Dateinamen als Eingabe verwenden, müssen Sie die exakte 8-Bit-Bytefolge beibehalten, die Ihnen in main() übergeben wurde. Wenn Sie es dem Benutzer anzeigen müssen, versuchen Sie es in der Codierung des aktuellen Gebietsschemas zu interpretieren und in Ihren bevorzugten Unicode-Typ zu konvertieren.

Auf vielen modernen Linux-Systemen wird die Codierung UTF-8 sein, so dass dies im Allgemeinen OK funktioniert.

Verwandte Themen