¿Cómo obtener el nombre del proceso actual en Linux?

2 minutos de lectura

avatar de usuario
mariusz

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

avatar de usuario
Pierre Habuzit

Si está usando una glibc, entonces:

#define _GNU_SOURCE
#include <errno.h>

extern char *program_invocation_name;
extern char *program_invocation_short_name;

Ver programa_invocación_nombre(3)

En la mayoría de los Unices, __progname también está definido por la libc. La única forma portátil es usar argv[0]

avatar de usuario
Michael Krelin – hacker

Es señalado por el argv[0] o de hecho puedes leer /proc/self/status. O puedes usar getenv("_")no estoy seguro de quién establece eso y qué tan confiable es.

  • Tenga en cuenta que getenv("_") parece devolver el proceso iniciado originalmente por el shell, si lo llamo en un proceso iniciado por make, veo “/usr/bin/make”, en lugar de mi nombre de proceso. Esto significa que probablemente esté configurado por el shell.

    –Roger Lipscombe

    29 de abril de 2014 a las 10:47

avatar de usuario
raj_gt1

Puedes usar __progname. Sin embargo, no es mejor que argv[0] ya que puede tener problemas de portabilidad. Pero como no tienes acceso a argv[0] puede funcionar de la siguiente manera: –

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

A menudo hago uso de la siguiente llamada,

char* currentprocname = getprogname();

Mira el valor de argv[0] que se pasó a main. Este debería ser el nombre bajo el cual se invocó su proceso.

  • Desafortunadamente en este caso no tengo acceso a argv[0]

    – Mariusz

    1 de febrero de 2012 a las 14:18

  • @Mariusz Entonces tendrá que pasar por el proceso, aunque lo recomiendo /proc/self/cmdline.

    – Boréalida

    1 de febrero de 2012 a las 14:19

  • @Mariusz, también puedes probar getenv("_") aunque no estoy seguro de cuán confiable es.

    – Michael Krelin – hacker

    1 de febrero de 2012 a las 14:28

avatar de usuario
Alés Teska

Esta es una versión que funciona en macOS, 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

  • Desafortunadamente en este caso no tengo acceso a argv[0]

    – Mariusz

    1 de febrero de 2012 a las 14:18

  • @Mariusz Entonces tendrá que pasar por el proceso, aunque lo recomiendo /proc/self/cmdline.

    – Boréalida

    1 de febrero de 2012 a las 14:19

  • @Mariusz, también puedes probar getenv("_") aunque no estoy seguro de cuán confiable es.

    – Michael Krelin – hacker

    1 de febrero de 2012 a las 14:28

avatar de usuario
SIGSEGV

Si no puede acceder a argv[] en main(), debido a que está implementando una biblioteca, puede ver mi respuesta a una pregunta similar aquí.

Básicamente se reduce a darle acceso a argc, argv[] y envp[] fuera de main(). Entonces podría, como otros ya han sugerido correctamente, usar argv[0] para recuperar el nombre del proceso.

  • o puede consultar /proc/self/cmdline

    – Erín

    17/09/2015 a las 17:49

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad