Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I find the location of the executable in C? [duplicate]

Tags:

c++

c

linux

path

unix

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.)

like image 923
eran Avatar asked Jun 01 '09 07:06

eran


2 Answers

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)

like image 139
lispmachine Avatar answered Sep 22 '22 00:09

lispmachine


Use GetModuleFileName() function if you are using Windows.

like image 25
Shino C G Avatar answered Sep 20 '22 00:09

Shino C G