这与 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
中的某些内容有关。
如果在此解决方案之后,我最终得到了一个符号链接(symbolic link),那么还有所有符号链接(symbolic link)的解决方案要处理(硬链接(hard link)可能超出了任何解决方案的范围)。这个解决方案看起来相对跨平台,但在 C 代码中也很繁重(应该比 svmon 更快)。我希望有比赛条件要处理。
谢谢,
更新:我正在寻找提交给 perl 开发人员的解决方案。他们会担心不安全的 PATH
,尤其是在 setuid
/setgid
场景中。见 perlsec 。我认为我们在这里可能没问题,但是如果您将 setuid
与伪造的 argv[0]
结合使用,您可能会迫使 perl 认为它在其他地方,并加载错误的模块。上面的“次佳”答案仅在不在 perl 的污点模式下才真正有效。
最佳答案
为什么不能使用 ps
选项作为基准?当然,您仍然需要处理 cmd 值以查看是否有前导“/”。就像是
ps -o pid,env,cwd,cmd | grep youAppName | awk -f programToRationalizePathName
我无法再访问 AIX,但我确实在它上面工作了 2 1/2 年,而且我知道我已经使用过这种功能。我不认为它很慢,但我的要求可能与您不同。
我的印象是你想要一个实用程序函数,一次 1 次调用返回完整路径,但如果你需要一个持续的过程并且担心每 1 分钟重新启动 ps(例如),看看AIX 特定的 nmon 实用程序。不确定它是否可以生成类似于
ps -o cmd
的输出,但可以将其设置为运行时间任意长,运行频率不限(间隔低至 1 秒),并且它只是一个进程,其输出可以重定向为需要。 (Nmon 不是 std 安装的一部分,但大多数组织都会安装它,因为它是 IBM 的幸运(如果不直接支持))。当然,所有“非 100%”警告都适用于您和评论中提到的类似问题。
我希望这有帮助。
关于c - 获取 AIX 上运行进程的可执行文件的完整路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6428227/