我想使用 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));
这里 exepath 为我们提供了可执行文件的完整路径。
类似地,对于 Windows,我们使用
GetModuleFileName(NULL, exepath, sizeof(exepath)); /* get fullpath of the service */
请帮助我如何在 HP-UX 上执行此操作,因为 HP-UX 中没有 /proc 目录。
首先,我想评论一下你的 Linux 解决方案:它的长度大约是所需长度的 5 倍,并且执行了许多完全不必要的操作,以及使用 1024 幻数,这完全是错误的:
$ grep PATH_MAX /usr/include/linux/limits.h
#define PATH_MAX 4096 /* # chars in a path name */
这是正确的最小替换:
#include <limits.h>
...
char exepath[PATH_MAX] = {0};
readlink("/proc/self/exe", exepath, sizeof(exepath));
其次,在 HP-UX 上您可以使用shl_get_r()
获取有关所有已加载模块的信息。在索引 0 处,您将找到有关主可执行文件的信息。这desc.filename
将指向可执行文件的名称execve(2)
time.
不幸的是,这个名字是相对的,所以你可能需要搜索$PATH
,如果应用程序这样做,则可能会失败putenv("PATH=some:new:path")
或者如果原始的exename是例如./a.out
并且应用程序已执行chdir(2)
since.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)