2011-05-21 34 views
18

Estoy en Linux y estoy bifurcando/ejecutando un nuevo proceso de mi aplicación C spawn. ¿Es posible cambiar también el nombre de estos nuevos procesos secundarios?Cambiar el nombre del proceso en Linux

Quiero ser capaz de identificar el proceso que se inicia en caso de que algo salga mal y tengo que matarlo manualmente. Actualmente todos tienen el mismo nombre.

+8

procesos no tienen nombres –

+1

Gracias Neil. Cuando miro dentro del Monitor de Sistemas, en realidad me muestra un nombre que es a lo que me refería. ¿Qué método usaría entonces? –

+0

Sospecho que es el nombre de archivo del ejecutable que creó el proceso; no puede cambiar eso. –

Respuesta

13

Creo que esto debería funcionar, para ilustrar el principio ...

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    argv[0][0] = 65; 
    sleep(10); 
} 

va a cambiar el nombre, y poner una "A" en lugar de la primera letra. CtrlZ para pausar, luego ejecute ps para ver el nombre cambiado. No tengo ni idea, pero parece algo peligroso, ya que algunas cosas pueden depender de argv[0].

Además, traté de reemplazar el puntero a otra cadena; sin cigarro Por lo tanto, esto solo funcionaría con strcpy y cadenas más cortas o iguales que el nombre original.

Puede o no haber una mejor manera de hacerlo. No lo sé.

EDIT: solución no literal: si está bifurcando, conoce el PID del niño (getpid() en el niño, resultado de fork() en el elemento principal). Solo déjelo en algún lugar donde pueda leerlo y mate al niño por PID.

otra solución no literal: haga enlaces al ejecutable con otro nombre (ln -s a.out kill_this_a.out), luego, cuando ejecute, ejecute el enlace. El nombre será el nombre del enlace.

+1

Gracias Amadan, +1 es una idea tan inteligente. Lo has probado antes Quiero decir, ¿podría causar algún problema? –

+2

@Frank: esto es compatible, y si observa su sistema, encontrará algunos programas que lo hacen. Está limitado por el tamaño de los argumentos existentes: puede sobrescribir caracteres individuales, no cambiar el tamaño del búfer o usar uno diferente. – Gilles

+7

Hay hacks feos para reutilizar las variables de entorno para espacio adicional, ver por ejemplo [aquí] (http://koders.com/c/fidE817FBB097E080657B0A6977E5F4C9612BC1E923.aspx?s=setproctitle.c).Con kernels recientes también puede hacer 'prctl (PR_SET_NAME, (unsigned long)" My Process ", 0, 0, 0);' - pero no todas las utilidades usan ese nombre como el nombre para mostrar predeterminado (top does, ps does not) y tiene un límite de 16 caracteres. – nos

0

El siguiente ejemplo de código cambiaría el nombre del proceso a "Prueba".

#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 

    int main (int argc, char *argv[]) { 
    char* temp = (char*) malloc (20); 
    strcpy(temp, "Testing"); 
    temp[7] = 0; 
    printf("Argv[0] --> %s\n", argv[0]); 
    argv[0] = temp; 
    printf("Argv[0] --> %s\n", argv[0]);  
    return 0; 
    } 

La salida del programa anterior es:

./a.out

argv [0] -> ./a.out

argv [0] -> Prueba

La argv [0] contiene el nombre del proceso.

Cuestiones relacionadas