Can an executable discover its own path? (Linux)
Well, you have to use getcwd()
in conjuction with argv[0]
. The first one gives you the working directory, the second one gives you the relative location of the binary from the working directory (or an absolute path).
Edit: It was pointed out that using /proc/self/exe
is more straightforward. That is entirely true, but I didn't see any benefit in editing the code. Since I still get comments about it, I've edited it.
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
int main()
{
char dest[PATH_MAX];
memset(dest,0,sizeof(dest)); // readlink does not null terminate!
if (readlink("/proc/self/exe", dest, PATH_MAX) == -1) {
perror("readlink");
} else {
printf("%s\n", dest);
}
return 0;
}
Initial answer:
You can use getpid() to find the pid of the current process, then read /proc/<pid>/cmdline
(for a human reader) or /proc/<pid>/exe
which is a symlink to the actual program. Then, using readlink(), you can find the full path of the program.
Here is an implementation in C:
#include <sys/types.h>
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
int main()
{
char path[PATH_MAX];
char dest[PATH_MAX];
memset(dest,0,sizeof(dest)); // readlink does not null terminate!
pid_t pid = getpid();
sprintf(path, "/proc/%d/exe", pid);
if (readlink(path, dest, PATH_MAX) == -1) {
perror("readlink");
} else {
printf("%s\n", dest);
}
return 0;
}
If you want to try, you can then compile this, make a symlink from the executable to an other path, and call the link:
$ gcc -o mybin source.c
$ ln -s ./mybin /tmp/otherplace
$ /tmp/otherplace
/home/fser/mybin
Use the proc filesystem
Your flow would be:
- Get pid of executable
- look at
/proc/PID/exe
for a symlink
The file /proc/self/exe is a simlink to the currently running executable.