2012-02-01 22 views

Respuesta

21

O bien apuntado por argv[0] o de hecho puede leer /proc/self/status. O puede usar getenv("_"), no estoy seguro de quién lo establece y qué tan confiable es.

+2

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 del proceso. Esto significa que probablemente esté configurado por el shell. –

+0

@RogerLipscombe, buena observación de hecho. –

5

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

+1

Desafortunadamente, en este caso no tengo acceso a argv [0] – Mariusz

+2

@Mariusz entonces usted va a tener que ir a través de proc - aunque recomiendo '/ proc/self/cmdline'. – Borealid

+0

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

9

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

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

Si estás en el uso de un 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 Unices, __progname también está definido por la libc. La manera portátil único es utilizar argv[0]

5

menudo hago uso de la siguiente llamada,

char* currentprocname = getprogname(); 
+3

Eso es específico de BSD. Puede obtenerlo en Linux con 'libbsd', pero no forma parte de libc como en FreeBSD u OS X. – Cairnarvon

1

Si no puede acceder argv [] en main(), porque va a implementar una biblioteca, puede tener un vistazo a mi respuesta en una pregunta similar here.

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

+0

o puede consultar/proc/self/cmdline – liang

0

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 
Cuestiones relacionadas