How do I find the location of the executable in C?

c, c++, linux, path, unix

Solution

To summarize:

On Unixes with `/proc` really straight and realiable way is to:

`readlink("/proc/self/exe", buf, bufsize)` (Linux)

`readlink("/proc/curproc/file", buf, bufsize)` (FreeBSD)

`readlink("/proc/self/path/a.out", buf, bufsize)` (Solaris)

On Unixes without `/proc` (i.e. if above fails):

If argv[0] starts with "/" (absolute path) this is the path.

Otherwise if argv[0] contains "/" (relative path) append it to cwd (assuming it hasn't been changed yet).

Otherwise search directories in `$PATH` for executable `argv[0]`.

Afterwards it may be reasonable to check whether the executable isn't actually a symlink. If it is resolve it relative to the symlink directory.

This step is not necessary in /proc method (at least for Linux). There the proc symlink points directly to executable.

Note that it is up to the calling process to set `argv[0]` correctly. It is right most of the times however there are occasions when the calling process cannot be trusted (ex. setuid executable).

On Windows: use `GetModuleFileName(NULL, buf, bufsize)`

Problem

Is there a way in C/C++ to find the location (full path) of the current executed program? (The problem with `argv[0]` is that it does not give the full path.)

Original source

Related problems