获取AIX上运行进程的可执行文件的完整路径

时间:2011-06-21 15:49:48

标签: c aix

除了AIX之外,这与Get full path of executable of running process on HPUX…最相似。

基本问题是:在AIX上,我如何确定当前可执行文件的完整路径?在做其他任何事情之前必须这样做(例如,chdir)没问题。

到目前为止,我发现的最准确的答案是检查来自的输出 svmon -P $$ -O format=nolimit,filename=on,filtertype=client
(其中$$的shell含义为:current pid)。这不仅是大量的C,而且svmon也不是很快,并且很容易压倒应用程序其余部分的运行时。

下一个最佳答案似乎是简单地查看argv[0],如果它有斜杠,则它是一个完整的路径名(以前导/开头)或相对于当前的-dir name(不以前导/开头)。如果它没有斜线,则它与PATH中的某个相对 如果在这个解决方案之后,我最终得到一个符号链接,那么所有的符号链接的解决方案也都要处理(硬链接可能超出了任何解决方案的范围)。这个解决方案看起来像是相对跨平台的,但在C代码中也很重(应该比svmon更快)。而且我希望有竞争条件可以处理。

谢谢,

更新:我正在寻找一个提交给perl开发者的解决方案。而且他们会担心一个不安全的PATH,特别是在setuid / setgid场景中。见perlsec。我认为我们可以在这里没问题,但是如果你将setuid与伪造argv[0]结合起来,你可以强迫perl认为它在其他地方,并加载错误的模块。上面的“下一个最好的”答案只有在perl的污点模式下才能真正起作用。

2 个答案:

答案 0 :(得分:0)

为什么不能使用ps选项作为基线?当然,您仍然需要处理cmd值以查看是否具有前导'/'。像

这样的东西
ps -o pid,env,cwd,cmd | grep youAppName | awk -f programToRationalizePathName 

我再也无法访问AIX了,但我确实已经工作了2年半,我知道我已经使用过这种功能了。我不认为它很慢,但我可能有不同的要求。

我得到的印象是你想要一个实用工具函数,一个一次性调用返回完整路径,但是如果你需要一个正在进行的过程而且担心每1分钟重新启动一次ps(例如) ,查看AIX特定的nmon实用程序。不确定它是否可以生成类似于ps -o cmd的输出,但它可以设置为根据需要运行,只要你想要的频率(低至1秒间隔),它只是一个进程,其输出可以根据需要重定向。 (Nmon不是std安装的一部分,但大多数组织都安装它,因为它是IBM祝福(如果不直接支持))。

当然,所有“非100%”的警告都适用于您和评论中提到的类似问题。

我希望这会有所帮助。

答案 1 :(得分:-1)

使用ps获取可执行路径地址

ps -aef | grep app | awk'{print $ 8}'

以上命令为您的应用提供可执行路径地址