2010-09-21 14 views
5

Quando si digita "ps aux", il comando ps mostra gli argomenti del comando con cui è stato eseguito il programma. Alcuni programmi cambiano questo modo per indicare lo stato. Ho provato a cambiare i campi argv [] e non sembra funzionare. Esiste un modo standard per impostare gli argomenti della riga di comando in modo che vengano visualizzati quando l'utente digita ps?Come impostare gli argomenti della riga di comando in un programma C in modo che sia visibile quando gli utenti digitano "ps aux"?

Cioè, questo non funziona:

int main(int argc,char **argv) 
{ 
    argv[0] = "Hi Mom!"; 
    sleep(100); 
} 

09:40 imac3:~$ ./x & 
[2] 96087 
09:40 imac3:~$ ps uxp 96087 
USER  PID %CPU %MEM  VSZ RSS TT STAT STARTED  TIME COMMAND 
yv32  96087 0.0 0.0 2426560 324 s001 S  9:40AM 0:00.00 ./x 
09:40 imac3:~$ cat x.c 
+0

Penso che si tratti di una cosa chiamata "estensione della scheda bash". È necessario definire un gestore di estensione scheda per il programma e registrarlo in qualche file, ma non chiedermi come farlo. – fuz

+0

Non possibile? (http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC22) Potrebbe piacerti anche (http://www.netsplit.com/2007/01/10/hiding-arguments-from- ps /) – pmg

risposta

5

hai avuto l'idea giusta, ma non si modificano le puntatori in argv[n], è necessario modificare la stringa puntata da argv[0] sé:

#include <string.h> 
#include <unistd.h> 

int main(int argc,char **argv) 
{ 
    size_t maxlen = strlen(argv[0]); 

    memset(argv[0], 0, maxlen); 
    strncat(argv[0], "Hi Mom!", maxlen); 
    pause(); 

    return 0; 
} 

(si noti che se questo realmente cambia il nome del comando mostrato da ps è dipendente dal sistema).

+0

Uso molto strano di 'strncat' ... –

+0

@R ..: No, non lo è. Combinato con 'strlen', @caf sta facendo un'osservazione molto attenta che potrebbe non essere garantito avere più spazio dell'originale' argv [0] 'per memorizzare il nome del nostro programma. Inoltre, 'memset' non è necessario,' strncat' terminerà sempre nullo. Risposta molto pulita, buon uso di 'pause()'. –

+0

Guarda di nuovo. 'strncat' viene usato per concatenare una stringa di lunghezza zero, cioè come' strlcpy' economico invece che per concatenazione effettiva. Il 'memset' non è necessario, ma avresti almeno bisogno di' argv [0] [0] = 0; 'per sostituirlo con la funzionalità desiderata. Questa non ovvietà è il motivo per cui ho detto che è strano. –