这与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的污点模式下才能真正起作用.
为什么不能使用ps
选项作为基线?当然,您仍然需要处理 cmd 值以查看是否有前导“/”。就像是
ps -o pid,env,cwd,cmd | grep youAppName | awk -f programToRationalizePathName
Run Code Online (Sandbox Code Playgroud)
我无法再访问 AIX,但我确实在它上面工作了 2 1/2 年,并且我知道我已经使用过此类功能。我不认为它很慢,但我可能和你有不同的要求。
我的印象是您想要一个实用函数,一次返回完整路径的 1 次调用,但如果您需要一个持续的进程并且担心每 1 分钟重新启动一次 ps(例如),请查看AIX 特定的 nmon 实用程序。不确定它是否可以生成类似于的输出,ps -o cmd
但它可以设置为运行任意长时间、任意频率(间隔低至 1 秒),并且它只是一个进程,其输出可以根据需要重定向。(Nmon 不是 std 安装的一部分,但大多数组织都会安装它,因为它是 IBM 的祝福(如果不直接支持))。
当然,所有“不是 100%”的警告都适用于您和评论中提到的类似问题。
我希望这有帮助。