¿Cómo puedo obtener el nombre del proceso en C? El mismo nombre, que está en /proc/$pid/status. No quiero analizar ese archivo. Es allí cualquier manera programática de hacer esto?

InformationsquelleAutor Mariusz | 2012-02-01

7 Comentarios

  1. 24

    Es señalado por el argv[0] o, de hecho, usted puede leer /proc/self/status. O usted puede utilizar getenv("_"), no estoy seguro, que establece que y el cómo de fiable es.

    • Tenga en cuenta que getenv("_") aparece devolver el proceso inició originalmente por el shell — si me llaman en un proceso iniciado por make, veo «/usr/bin/make», en lugar de mi nombre de proceso. Esto significa que es probable que sea establecido por el shell.
    • buena observación, de hecho.
  2. 35

    Si usted está utilizando una glibc, entonces:

    #define _GNU_SOURCE
    #include <errno.h>
    
    extern char *program_invocation_name;
    extern char *program_invocation_short_name;

    Ver program_invocation_name(3)

    En la mayoría de los sistemas unix, __progname se define también por la libc.
    La única manera portable es el uso de argv[0]

  3. 15

    Puede utilizar __progname. Sin embargo no es la mejor que argv[0] ya que pueden tener problemas de portabilidad. Pero como usted no tiene acceso a argv[0] se puede trabajar de la siguiente manera:-

    extern char *__progname;
    printf("\n%s", __progname);
  4. 5

    Mirar el valor de argv[0] que fue aprobada a main. Este debe ser el nombre con el que su proceso fue invocada.

    • Por desgracia en este caso no tengo acceso a argv[0]
    • Entonces usted va a tener que ir a través de proc – aunque recomiendo /proc/self/cmdline.
    • También puede intentar getenv("_") aunque no estoy seguro de qué tan confiable es.
  5. 5

    A menudo me hacen uso de la siguiente llamada,

    char* currentprocname = getprogname();
    • Que la BSD-específicos. Usted puede obtener en Linux con libbsd, pero no es parte de la libc de como es en FreeBSD o mac OS X.
  6. 1

    Si no puedes acceder a argv[] en main(), porque va a implementar una biblioteca, usted puede tener una mirada en mi respuesta en una pregunta similar aquí.

    Que básicamente se reduce a dar a usted el acceso a argc, argv[] y envp[] fuera de main().
    Entonces usted podría, como otros ya han correctamente sugerido, el uso de argv[0] para recuperar el nombre de proceso.

    • o usted podría mirar en /proc/self/cmdline
  7. 0

    Esta es una versión que funciona en mac os, FreeBSD y Linux.

    #if defined(__APPLE__) || defined(__FreeBSD__)
    const char * appname = getprogname();
    #elif defined(_GNU_SOURCE)
    const char * appname = program_invocation_name;
    #else
    const char * appname = "?";
    #endif

Dejar respuesta

Please enter your comment!
Please enter your name here