2010-09-21 6 views
5

Cuando escribe "ps aux", el comando ps muestra los argumentos de comando con los que se ejecutó el programa. Algunos programas cambian esto como una forma de indicar el estado. Intenté cambiar los campos argv [] y parece que no funciona. ¿Existe una forma estándar de establecer los argumentos de línea de comando para que aparezcan cuando el usuario escribe ps?¿Cómo configuro los argumentos de la línea de comando en un programa C para que esté visible cuando los usuarios escriben "ps aux"?

Es decir, esto no funciona:

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

Creo que este es un tipo de cosa llamada "extensión de pestaña bash". Necesita definir un manejador de extensión de pestañas para su programa y registrarlo en algún archivo, pero no me pregunte cómo hacerlo. – fuz

+0

¿No es posible? (http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC22) También te puede interesar (http://www.netsplit.com/2007/01/10/hiding-arguments-from- ps /) – pmg

Respuesta

5

Se tenía la idea correcta, pero no cambian el punteros enargv[n], debe cambiar la cadena apuntada por 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; 
} 

(Tenga en cuenta que si es o no realmente cambia el nombre del comando se muestra por ps es dependiente del sistema).

+0

Uso muy extraño de 'strncat' ... –

+0

@R ..: No, no lo es. Combinado con 'strlen', @caf está haciendo una observación muy cuidadosa de que no se puede garantizar que tengamos más espacio que el' argv [0] 'original para almacenar el nombre de nuestro programa. Además, el 'memset' no es necesario,' strncat' siempre terminará nulo. respuesta muy limpio, buen uso de 'pausa()'. –

+0

Mira de nuevo. 'strncat' se utiliza para concatenar a una cadena de longitud cero, es decir, como un' 'strlcpy'' barato en lugar de una concatenación real. El 'memset' es innecesario, pero al menos necesitarías' argv [0] [0] = 0; 'para reemplazarlo por la funcionalidad deseada. Esta nonobviousness es por qué dije que es extraño. –

Cuestiones relacionadas