find the fully-qualified path for the app my module is running in

Hi-

I need the cpp call that will tell me the full path to the app I'm running in. For example, I'm running in a loaded library for either mozilla or firefox, but would like to know the full path to the executable

/usr/bin/firefox
/usr/bin/mozilla
/usr/local/firefox1_5

etc...

(For windows programmers, it would be the Linux version of GetModuleFileNameW)

Thanks!

There is no one perfect way to do this in Linux/Unix.

argv[0] may have it, unless the file was exec'd, getcwd() may be it, or
you can try a directory search.

This is because files can be run in a lot of different ways, and Linux does not have a registry.

I agree. But the following solution might work for the OP (Caution.. a /proc based solution.)

#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

/* Finds the path containing the currently running program executable.
  The path is placed into BUFFER, which is of length LEN. Returns
  the number of characters in the path, or -1 on error. */

size_t get_executable_path (char* buffer, size_t len)
{
 char* path_end;
 /* Read the target of /proc/self/exe. */
 if (readlink ("/proc/self/exe", buffer, len) <= 0)
  return -1;
 /* Find the last occurrence of a forward slash, the path separator. */
 path_end = strrchr (buffer, '/');
 if (path_end == NULL)
  return -1;
 /* Advance to the character past the last slash. */
 ++path_end;
 /* Obtain the directory containing the program by truncating the
   path after the last slash. */
 *path_end = '\0';
 /* The length of the path is the number of characters up through the
   last slash. */
 return (size_t) (path_end - buffer);
}

int main ()
{
 char path[PATH_MAX];
 get_executable_path (path, sizeof (path));
 printf ("this program is in the directory %s\n", path);
 return 0;
}

This solution fixes problems such as env settings which are exclusive for the app, and which are required to be set by the user prior to executing the app.

I picked this up from the net a long time ago.

That will work fine for Linux or other versions of unix that support /proc.

Yet another way would be to use the results of

/proc/proc-id/maps

This would be a longer solution (compared to the /proc/self/exe) because you will have to read through each line till you reach one which has your app-name in it. From there, its an easy ride.

Yes, these solutions are for /proc based OS's.

Vino