总结一下:
在Unix上,有/proc
个真正直接可行的方法是:
readlink("/proc/self/exe", buf, bufsize)
(Linux)
readlink("/proc/curproc/file", buf, bufsize)
(FreeBSD)
readlink("/proc/self/path/a.out", buf, bufsize)
(Solaris)
在不含/proc
的UNIX上(即,如果以上失败):
如果argv[0]以"/"开头(绝对路径),这就是路径.
否则,如果argv[0]包含"/"(相对路径),则将其附加到cwd
否则,在$PATH
中的目录中搜索可执行文件argv[0]
.
之后,可以判断可执行文件是否实际上不是符号链接.
这个步骤在/proc方法中不是必需的(至少对于Linux是这样).
请注意,正确设置argv[0]
取决于调用进程.
这在大多数情况下是正确的,但是,在某些情况下,调用进程是不可信的(例如,setuid可执行文件).
在Windows上:使用GetModuleFileName(NULL, buf, bufsize)