在另一个问题中,答案指出,在带有 的 Unix 上/proc
,真正直接可靠的方法是 to readlink("/proc/self/exe", buf, bufsize)
,然后它继续提供备份解决方案,如下所示:
在没有 /proc 的 Unix 上(即如果上述失败):
- 如果 argv[0] 以“/”(绝对路径)开头,这就是路径。
- 否则,如果 argv[0] 包含“/”(相对路径),则将其附加到 cwd(假设尚未更改)。
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1); strncat(buf, argv[0], bufsize-strlen(buf)-1);
- 否则在目录中搜索
$PATH
可执行文件argv[0]
。
之后检查可执行文件是否实际上不是符号链接可能是合理的。如果是相对于符号链接目录解析它。
现在就我而言,不幸的是,以上都不起作用:
/proc/self/exe exists
readlink()
但由于权限被拒绝 errno 13而失败。argv[0]
没有/
绝对或相对路径。$PATH
不包含在 中找到的可执行文件argv[0]
。
当 sgid 应用程序运行时,似乎也面临这个问题。就我而言,它不是 sgid,而是 inetd 启动。