2010-01-05 14 views
7

Mi chiedo se ci sono alcune API per ottenere gli argomenti della riga di comando del processo corrente su Linux.equivalente Linux di GetCommandLine e CommandLineToArgv?


Credo di essere stato terribilmente poco chiaro. Il vero scopo della domanda riguardava il passaggio dei nomi dei file Unicode attraverso gli argomenti della riga di comando.

+1

'int main (int argc, char * argv [])', e si ha in 'argc' il numero di argomenti, e' argv' è una matrice di puntatori 'char' che contengono gli argomenti. Questo è ANSI C, quindi funzionerà su qualsiasi implementazione portatile. O vuoi l'analisi delle opzioni da linea di comando? –

+0

Vedo. Ero a conoscenza del paradigma argc argv. Mi chiedo come sia possibile ottenere argomenti unicode tramite argv. – lyxera

+2

argv ti darà tutto ciò che la shell ha messo lì; dal momento che la shell lo tratta come una stringa di byte, che la spinge indietro al terminale. Tutti i terminali comuni ora sono compatibili con Unicode, quindi dovrebbe funzionare. –

risposta

9

leggere dal file /proc/self/cmdline

Ad esempio:

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

Oppure, per un soddisfacente rinfrescante autoreferenzialità:

[[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

Fare attenzione ai byte null (0x00) che delimitano ciascun token. Inoltre, il testo in/proc/self/cmdline non sarà esattamente quello che l'utente ha digitato: le virgolette saranno rimosse, ecc. –

+0

Inoltre, fai attenzione che attualmente l'interfaccia '/ proc' mostra solo la prima pagina (4k) di la riga di comando, anche se potrebbe essere più lunga (credo fino a 32 pagine). – Jester

3

cassa Getopt Si tratta di una libreria di analisi a riga di comando che è implementata in molte lingue tra cui C.

Altrimenti:

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

argv è una matrice di argomenti come char* e argc è il numero di argomenti.

argv[0] è sempre il nome file eseguibile stesso.

+0

Vuoi dire Getopt? – fennec

+0

ah sì, grazie fennec –

1

Basta usare argc e argv. argv sarà nella codifica locale (che potrebbe essere UTF-8) e da lì è possibile convertire in wchar_t (ad esempio tramite mbtowc).

1

Linux non esegue "nomi di file Unicode" di per sé. Tutti i nomi di file sono sequenze casuali di caratteri a 8 bit per quanto riguarda il kernel.

Le cose brutte possono accadere, come l'utente può scrivere un file e quindi cambiare la loro locale, lasciando il loro nome di file codificato nella locale precedente. Quindi se stai prendendo un nome di file come input, devi conservare la sequenza esatta di byte a 8 bit che ti è stata passata in main(). Se è necessario visualizzarlo all'utente, provare a interpretarlo nella codifica delle impostazioni internazionali correnti e convertire nel tipo preferito di Unicode.

Su molti moderni sistemi Linux, la codifica sarà UTF-8, quindi generalmente funzionerà OK.