To summarize:
-
On Unixes with
/procreally 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 “https://stackoverflow.com/” (absolute path) this is the path.
-
Otherwise if argv[0] contains “https://stackoverflow.com/” (relative path) append it to cwd
(assuming it hasn’t been changed yet). -
Otherwise search directories in
$PATHfor executableargv[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)