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

use*_*804 1 c c++ hp-ux

我希望在没有使用C++代码的root权限的情况下获得正在运行的进程(可执行文件)的完整路径.有人可以建议一种方法来实现这一目标.

在Linux平台上我可以通过以下方式来实现.

char exepath[1024] = {0};
char procid[1024] = {0};
char exelink[1024] = {0};

sprintf(procid, "%u", getpid());

strcpy(exelink, "/proc/");
strcat(exelink, procid);
strcat(exelink, "/exe");

readlink(exelink, exepath, sizeof(exepath));
Run Code Online (Sandbox Code Playgroud)

这里exepath为我们提供了可执行文件的完整路径.

同样对于Windows我们使用它

GetModuleFileName(NULL, exepath, sizeof(exepath));  /* get fullpath of the service */
Run Code Online (Sandbox Code Playgroud)

请帮助我在HP-UX上执行此操作,因为HP-UX中没有/ proc目录.

小智 9

首先,我想对你的Linux解决方案发表评论:它大约是它需要的5倍,执行大量完全不必要的操作,以及使用1024个幻数,这是完全错误的:

$ grep PATH_MAX /usr/include/linux/limits.h 
#define PATH_MAX        4096    /* # chars in a path name */
Run Code Online (Sandbox Code Playgroud)

这是一个正确的最小替换:

#include <limits.h>
...
  char exepath[PATH_MAX] = {0};
  readlink("/proc/self/exe", exepath, sizeof(exepath));
Run Code Online (Sandbox Code Playgroud)

其次,在HP-UX上,您可以使用shl_get_r()获取有关所有已加载模块的信息.在索引0处,您将找到有关主可执行文件的信息.在desc.filename将指向可执行文件的名称的execve(2)时候.

遗憾的是,该名称是相对的,因此您可能必须进行搜索$PATH,如果应用程序执行此操作,putenv("PATH=some:new:path")或者如果原始exename是例如./a.out并且应用程序已执行,则可能会失败chdir(2).