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

C 获取AIX上运行进程的可执行文件的完整路径,c,aix,C,Aix,除了AIX之外,这与最相似 基本问题是:在AIX上,如何确定当前可执行文件的完整路径?在做任何其他事情(例如,chdir)之前必须这样做是可以的 到目前为止,我找到的最准确的答案是检查 svmon-P$$-O format=nolimit,filename=on,filtertype=client (其中$$的shell含义为:当前pid)。这不仅是大量的C语言,而且svmon速度也不是很快,很容易就淹没了应用程序其余部分的运行时 下一个最好的答案似乎是只看一下argv[0],如果它有一个斜杠,

除了AIX之外,这与最相似

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

到目前为止,我找到的最准确的答案是检查
svmon-P$$-O format=nolimit,filename=on,filtertype=client

(其中$$的shell含义为:当前pid)。这不仅是大量的C语言,而且svmon速度也不是很快,很容易就淹没了应用程序其余部分的运行时

下一个最好的答案似乎是只看一下
argv[0]
,如果它有一个斜杠,它要么是完整路径名(以前导/)要么是相对于当前目录名(不以前导/)的。如果它没有斜杠,那么它是相对于路径中的某个内容的 如果在这个解决方案之后,我最终得到了一个符号链接,那么也需要处理所有符号链接的解决方案(硬链接可能超出了任何解决方案的范围)。这个解决方案看起来是相对跨平台的,但是在C代码中也是非常繁重的(应该比svmon更快)。我希望有一些比赛条件需要处理

谢谢


更新:我正在寻找提交给perl开发人员的解决方案。他们会担心不安全的
路径
,特别是在
setuid
/
setgid
场景中。看见我认为我们在这里可以做得很好,但是如果您将
setuid
与伪造
argv[0]
相结合,您可能会迫使perl认为它在其他地方,并加载错误的模块。上面的“次优”答案只有在不使用perl的污染模式时才有效。

为什么不能使用
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%”警告适用于您和评论中提到的类似问题


我希望这有帮助。

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

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


上面的命令为您的应用程序提供了可执行路径地址

签出。签出我想在库中执行此操作,以便将其放入错误日志中,并且我无法合理地要求我的呼叫者传入
argv[0]
。我尝试了您建议的命令,但这给了我一个非常好的错误,ps选项不正确。在我的情况下,
env
cwd
标志不存在,正确的synthax是
ps-o=pid,cmd
,而且命令不一定显示完整路径。hm。。是的,我的Linux也没有
cwd
,我不知道在哪里找到的。我假设您发现这个问题是因为AIX?我不记得了,AIX支持/proc/$PID吗?如果是这样,(您需要cwd),您可能会发现它是一个子值。如果你有一个活跃的用例,发布一个问题。祝你好运当然,您可以将当前pid传递给
ps
,去掉
grep
@pjtrail:是的,我仍然不确定O.P.s用例是什么。标题说明了一件事,长篇大论说明了另一件事。请随时发布答案;-)祝大家好运。在AIX
ps-aef | grep app | awk'{print$8}'
中尝试,结果肯定不是可执行文件的完整路径名。