【发布时间】:2011-09-19 16:06:06
【问题描述】:
这与Get full path of executable of running process on HPUX… 最相似,AIX 除外。
基本问题是:在 AIX 上,我如何确定当前可执行文件的完整路径?在做任何其他事情之前必须这样做(例如,chdir)很好。
到目前为止,我找到的最准确的答案是检查来自svmon -P $$ -O format=nolimit,filename=on,filtertype=client
的输出
(其中 $$ 有其 shell 含义:当前 pid)。这不仅是大量的 C,而且 svmon 也不是很快,很容易压倒应用程序其余部分的运行时间。
下一个最佳答案似乎是简单地查看argv[0],如果它有一个斜杠,它要么是完整路径名(以前导 / 开头)要么是相对于当前目录名称(不以前导 / 开头)。如果它没有斜线,则它与PATH 中的某些内容相关。
如果在这个解决方案之后,我最终得到了一个符号链接,那么还有符号链接的所有解决方案都需要处理(硬链接可能超出了任何解决方案的范围)。这个方案看起来是比较跨平台的,但是C代码也很重(应该比svmon快)。而且我希望有竞争条件等需要处理。
谢谢,
更新:我正在寻找提交给 perl 开发人员的解决方案。他们会担心不安全的PATH,尤其是在setuid/setgid 场景中。见perlsec。我认为我们在这里可以没问题,但是如果您将setuid 与伪造argv[0] 结合使用,您可能会迫使perl 认为它在其他地方,并加载错误的模块。上面的“次佳”答案只有在不处于 perl 的污染模式时才真正有效。
【问题讨论】:
-
我想在库中执行此操作,以便将其放入错误日志中,并且我不能合理地要求我的调用者传入
argv[0]。